【发布时间】:2020-09-17 13:37:16
【问题描述】:
如果使用 URLSession 对网络请求使用组合,则需要保存 Subscription(又名 AnyCancellable) - 否则会立即解除分配,从而取消网络请求。稍后,当网络响应处理完毕后,您希望取消分配订阅,因为保留它会浪费内存。
以下是执行此操作的一些代码。这有点尴尬,甚至可能不正确。我可以想象一个竞争条件,网络请求可以在 sub 设置为非零值之前在另一个线程上启动和完成。
有更好的方法吗?
class SomeThing {
var subs = Set<AnyCancellable>()
func sendNetworkRequest() {
var request: URLRequest = ...
var sub: AnyCancellable? = nil
sub = URLSession.shared.dataTaskPublisher(for: request)
.map(\.data)
.decode(type: MyResponse.self, decoder: JSONDecoder())
.sink(
receiveCompletion: { completion in
self.subs.remove(sub!)
},
receiveValue: { response in ... }
}
subs.insert(sub!)
【问题讨论】:
标签: swift combine urlsession