为什么 .delay 在 swift 中使用 Combine 框架来破坏这段简短的代码

Why does .delay break this short piece of code using Combine framework in swift

提问人:user3069232 提问时间:2/11/2021 更新时间:2/11/2021 访问量:328

问:

Swift 5.x iOS 14

编写了此代码,尝试了解 Combine Framework 中的序列发布者。

struct SwiftUIViewH: View {
  @State var textColor = Color.black
  var body: some View {
    Text("Hello, World!")
      .foregroundColor(textColor)
      .onAppear { 
        let initialSequence = [Color.red, Color.blue, Color.green, Color.orange]
        _ = initialSequence.publisher
              .delay(for: 1.0, scheduler: RunLoop.main)
              .sink {
                textColor = $0
                print($0)
              }
        }
  }
}

它有效,因为我在几毫秒内浏览列表并更改 hello World 的颜色,如果我不尝试延迟减慢该过程?但是,正如您在这里看到的那样,由于延迟到位,它似乎什么也没做......上面的代码坏了

iOS Swift 序列 组合

评论


答:

1赞 Murlakatam 2/11/2021 #1

发生这种情况是因为您不存储订阅后返回的。一旦解除分配,整个订阅就会被取消。 毫不拖延,一切正常,因为在订阅后立即呼叫订阅者。CancellableCancellable

向视图添加属性:

@State var cancellable: AnyCancellable?

订阅后返回保存:Cancellable

cancellable = initialSequence.publisher

但是,您的代码不会在每次颜色更改之间增加延迟。所有颜色都会立即发送 - >您为每个事件添加延迟 - > 1 秒后,所有颜色都会发送到订阅者:)。

评论

0赞 user3069232 2/12/2021
stackoverflow.com/users/667482/murlakatam谢谢你的回答。我将其选中为可接受的,因为它确实修复了代码,即使我仍然只是得到一个橙色单词并错过了所有其他单词。
1赞 Murlakatam 2/12/2021
@user3069232 如果您只需要它来测试某些东西,那么替换为 和 颜色将在每秒钟后发生变化。.delay(for: 1.0, scheduler: RunLoop.main).zip(Timer.publish(every: 1, on: RunLoop.main, in: .default).autoconnect())