【发布时间】:2021-03-20 10:06:30
【问题描述】:
我有几个 datataskpublisher,它们从不同的应用程序屏幕执行对服务器的请求。如何让它们串行运行?
下面是一个粗略的例子
这是一个执行请求和附加逻辑的服务。
class Service {
var cacheResult: Data?
var cacnellable: AnyCancellable?
static let shared = Service()
func performPost() -> AnyPublisher<Data, URLError> {
let task = URLSession.shared.dataTaskPublisher(for: URL(string: "postURL")!)
.map { (data, _) in data}
.multicast(subject: PassthroughSubject())
cacnellable = task.eraseToAnyPublisher().sink(
receiveCompletion: {_ in },
receiveValue: { data in
self.cacheResult = data
})
return task.autoconnect().eraseToAnyPublisher()
}
func performGet() -> AnyPublisher<Data, URLError> {
let task = URLSession.shared.dataTaskPublisher(for: URL(string: "getURL")!)
.map { (data, _) in data}
.multicast(subject: PassthroughSubject())
cacnellable = task.eraseToAnyPublisher().sink(
receiveCompletion: {_ in },
receiveValue: { data in
self.cacheResult = data
})
return task.autoconnect().eraseToAnyPublisher()
}
}
这是视图
final class GetVC: UIViewController {
let service = Service.shared
var cancellable: AnyCancellable?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
cancellable = service.performGet()
.sink(receiveCompletion: {_ in},
receiveValue: { data in
print("Present data")
})
}
}
final class PostVC: UIViewController {
let service = Service.shared
var cancellable: AnyCancellable?
lazy var button: UIButton = {
let btn = UIButton(primaryAction: UIAction(handler: { _ in
self.cancellable = self.service.performPost()
.sink(receiveCompletion: {_ in },
receiveValue: { data in
print("Some logic")
})
}))
return btn
}()
}
我需要请求永远不会并行发送到服务器
如果“发布任务”完成,“获取任务”开始
谢谢!
【问题讨论】:
标签: multithreading nsurlsession combine nsurlsessiondatatask