为什么在我的组合管道中从未调用过接收器?
Why is sink never called in my combine pipeline?
这是我的管道:
URLSession.shared
.dataTaskPublisher(for: urlRequest)
.map { [=10=].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 在网络请求完成之前销毁您的管道。
您的管道 returns 一个 Cancellable. Either assign that Cancellable directly to an instance variable or add the store(in:)
操作员到您的管道。
另外值得一提的是,如果您在 Xcode playground 中乱用 Combine 管道,您的管道可能会比您预期的寿命更长,因为 Playground 试图聪明地保留对为了使实验更容易。请参阅 以了解您可以在操场上 运行 的异步示例,即使它不应用我提到的任何修复。
这是我的管道:
URLSession.shared
.dataTaskPublisher(for: urlRequest)
.map { [=10=].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 在网络请求完成之前销毁您的管道。
您的管道 returns 一个 Cancellable. Either assign that Cancellable directly to an instance variable or add the store(in:)
操作员到您的管道。
另外值得一提的是,如果您在 Xcode playground 中乱用 Combine 管道,您的管道可能会比您预期的寿命更长,因为 Playground 试图聪明地保留对为了使实验更容易。请参阅