URLSession.shared.dataTask vs dataTaskPublisher,什么时候用哪个?
URLSession.shared.dataTask vs dataTaskPublisher, when to use which?
我最近遇到了两个数据获取(下载)API,它们对我来说执行的似乎是同一件事。我不知道什么时候应该用一个而不是另一个。
我可以用URLSession.shared.dataTask
var tasks: [URLSessionDataTask] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
let task = URLSession.shared.dataTask(with: tuple.imageURL, completionHandler :
{ data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() { [weak self] in
self?.displayFlag(data: data, title: tuple.name)
}
})
tasks.append(task)
task.resume()
}
deinit {
tasks.forEach {
[=11=].cancel()
}
}
或者我可以使用 URLSession.shared.dataTaskPublisher
var cancellables: [AnyCancellable] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
URLSession.shared.dataTaskPublisher(for: tuple.imageURL)
.sink(
receiveCompletion: {
completion in
switch completion {
case .finished:
break
case .failure( _):
return
}},
receiveValue: { data, _ in DispatchQueue.main.async { [weak self] in self?.displayFlag(data: data, title: tuple.name) } })
.store(in: &cancellables)
}
deinit {
cancellables.forEach {
[=12=].cancel()
}
}
我看不出它们有什么明显的区别,因为两者都可以获取,并且都为我们提供了轻松取消任务的能力。有人可以阐明他们在何时使用哪个方面的差异吗?
第一个是经典。它已经存在了相当长的一段时间,大多数(如果不是所有)开发人员都熟悉它。
第二个是对第一个的包装,并允许将其与其他发布者结合(例如,仅在执行前两个请求时才执行某些请求)。使用第一种方法组合数据任务会困难得多。
所以要点:对 one-shot 请求使用第一个。当需要更多逻辑来 combine/pass 结果 with/to 其他发布者(不仅来自 URLSession)时,使用第二个。基本上,这就是 Combine 框架背后的想法——您可以组合不同的异步机制方式(利用回调的数据任务就是其中之一)。
更多信息可以在去年的 WWDC 视频中找到,介绍 combine。
我最近遇到了两个数据获取(下载)API,它们对我来说执行的似乎是同一件事。我不知道什么时候应该用一个而不是另一个。
我可以用URLSession.shared.dataTask
var tasks: [URLSessionDataTask] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
let task = URLSession.shared.dataTask(with: tuple.imageURL, completionHandler :
{ data, response, error in
guard let data = data, error == nil else { return }
DispatchQueue.main.async() { [weak self] in
self?.displayFlag(data: data, title: tuple.name)
}
})
tasks.append(task)
task.resume()
}
deinit {
tasks.forEach {
[=11=].cancel()
}
}
或者我可以使用 URLSession.shared.dataTaskPublisher
var cancellables: [AnyCancellable] = []
func loadItems(tuple : (name : String, imageURL : URL)) {
URLSession.shared.dataTaskPublisher(for: tuple.imageURL)
.sink(
receiveCompletion: {
completion in
switch completion {
case .finished:
break
case .failure( _):
return
}},
receiveValue: { data, _ in DispatchQueue.main.async { [weak self] in self?.displayFlag(data: data, title: tuple.name) } })
.store(in: &cancellables)
}
deinit {
cancellables.forEach {
[=12=].cancel()
}
}
我看不出它们有什么明显的区别,因为两者都可以获取,并且都为我们提供了轻松取消任务的能力。有人可以阐明他们在何时使用哪个方面的差异吗?
第一个是经典。它已经存在了相当长的一段时间,大多数(如果不是所有)开发人员都熟悉它。
第二个是对第一个的包装,并允许将其与其他发布者结合(例如,仅在执行前两个请求时才执行某些请求)。使用第一种方法组合数据任务会困难得多。
所以要点:对 one-shot 请求使用第一个。当需要更多逻辑来 combine/pass 结果 with/to 其他发布者(不仅来自 URLSession)时,使用第二个。基本上,这就是 Combine 框架背后的想法——您可以组合不同的异步机制方式(利用回调的数据任务就是其中之一)。
更多信息可以在去年的 WWDC 视频中找到,介绍 combine。