代码之家  ›  专栏  ›  技术社区  ›  matt

Combine Framework的“append”运算符中的值的计时?

  •  0
  • matt  · 技术社区  · 4 年前

    这个 documentation 关于联合框架 append 操作员说:

    此运算符在此发布器完成之前不生成任何元素。然后,它生成此发布者元素,然后是给定的发布者元素。

    因此,我希望第一个出版商的元素能够一次性全部生产出来,而不管第一个出版商实际发布的时间。但事实并非如此。

    例如:

        [1,2,3,4].publisher.flatMap(maxPublishers: .max(1)) {
            Just($0).delay(for: 1, scheduler: DispatchQueue.main)
        }.append( Just(100) )
    

    如您所见,第一家出版商生产 1 , 2 , 3 , 4 每隔一秒。根据文献, 附加 应该 等待 直到生成了所有四个值,即四秒钟,然后一次重新发布这些值。但事实并非如此。我所看到的只是第一个出版商自己生产的东西,即, 1. , 2. , 3. , 4. 每隔一秒。发生什么事?

    1 回复  |  直到 4 年前
        1
  •  1
  •   matt    4 年前

    文件似乎有误。

    另一种看待这一点的方法是从第一个出版商开始 从未 完成面:

        Timer.publish(every: 1, on: .main, in: .common).autoconnect()
            .append(Just(Date()))
    

    如果文档是正确的,那将永远不会产生任何值,因为第一个发布者永远不会完成。但相反,它每秒都会产生第一个出版商的价值观。

    实际使用的策略 append (Publishers.Connectate)似乎是这样的:

    • 它订阅了第一家出版商,并在其价值观到来时重新发布。

    • 如果它从第一个发布者那里收到完成的完成,它会订阅第二个发布者,并在其值到达时重新发布。

    标题也出现了错误:

    此运算符在此发布器完成之前不生成任何元素。

    我的猜测是,在开发的早期阶段,苹果可能确实实施了 .append (串联),如文档中所述,但后来他们意识到这是错误的,并在不更改文档以匹配的情况下进行了更改。