【发布时间】:2021-02-06 04:28:10
【问题描述】:
我最近遇到了两个数据获取(下载)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 {
$0.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 {
$0.cancel()
}
}
我看不出它们有明显的区别,因为两者都可以获取,并且都可以让我们轻松取消任务。有人可以阐明他们在何时使用 which 方面的差异吗?
【问题讨论】:
-
第二个使用新的Combine框架
-
他知道这一点。他在问为什么要使用组合模式。
-
谢谢,@JoakimDanielson。我们什么时候应该使用原来的,什么时候应该使用Combine框架?使用 Combine 框架有什么好处?抱歉,我来自 Android Dev 背景,因此对 iOS 的了解有限。
-
当克劳斯建议合并时,我认为他是在建议您不需要
deinit清理。发布者发布后,请求应自动取消(这就是他在回答您的其他问题时推荐它的原因)。就我个人而言,如果它解决了其他问题(例如控制并发程度、链接其他发布者或组合操作符,已经将它用于项目中的其他事情),我会引入组合。我不确定我是否会在这里介绍它,只是为了不必手动取消请求,但这取决于你。这是一个见仁见智的问题。 -
您需要阅读 Combine 并自行决定,但 Combine 是用于异步处理的新框架,因此可能值得考虑。
标签: ios swift urlsession