swift - 为什么我的合并管道中从未调用 sink ?

标签 swift nsurlsession combine

这个问题在这里已经有了答案:





URLSession.shared.dataTaskPublisher not working on IOS 13.3

(3 个回答)


1年前关闭。




这是我的管道:

URLSession.shared
      .dataTaskPublisher(for: urlRequest)
      .map { $0.data }
      .mapError { ...... }
      .eraseToAnyPublisher()
      .decode(type: MyObject.self, decoder: JSONDecoder())
      .receive(on: RunLoop.main)
      .catch { [weak self] error -> Just<MyObject> in
        guard let self = self else { return Just(emptyPayload) }
        self.hasError = true
        return Just(emptyPayload)
    }
    .sink(
      receiveCompletion: { [weak self] _ in
        print("i'm here")
      },
      receiveValue: { [weak self] value in
        print("value")
      }
    )

为什么从不调用 sink ?

最佳答案

dataTaskPublisher(for: urlRequest)将异步发送值。当程序执行离开您当前的范围时,不再有对您的管道的引用,并且 ARC 在网络请求完成之前销毁您的管道。

您的管道返回 Cancellable .要么将该 Cancelable 直接分配给实例变量,要么添加 store(in:) 运算符(operator)到您的管道。

另外值得一提的是,如果您在 Xcode playground 中使用组合管道,您的管道可能会比您预期的要长,因为 Playground 试图聪明地保留引用,以便使实验更容易。见 this answer对于异步示例,您可以在操场上运行,即使它不适用我提到的任何修复程序。

关于swift - 为什么我的合并管道中从未调用 sink ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59292764/

相关文章:

ios - UIPickerView 获取另一个 UIPickerView 的值

swift - 如何在 cocoa 中快速设置打印?

iOS 9.3 : An SSL error has occurred and a secure connection to the server cannot be made

ios - 如何使用 segues 执行自定义动画?

ios - 是否建议在完成与它们的工作后销毁 UIViewController

ios - 回调违反控制反转

ios - SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个

ios - Swift Combine-多线程上的Publishers.CombineLatest

ios - NSURLSession 错误域=NSPOSIXErrorDomain 代码=2 "No such file or directory"

ios - 来自 NSURLSession 的 performSegueWithIdentifier