我不知道如何一个一个地执行多个 NSUrlSession 任务。当第一个任务完成时启动第二个任务,当第二个任务完成时启动第三个任务等
例如,我想从 Web 服务下载多个文件。
我希望他们开始一一下载。
例如文件: 1.png , 2.png , 3.png
我希望按照我编写它们的相同顺序下载它们。
我怎么能用 NSUrlSession 做到这一点?
我不知道如何一个一个地执行多个 NSUrlSession 任务。当第一个任务完成时启动第二个任务,当第二个任务完成时启动第三个任务等
例如,我想从 Web 服务下载多个文件。
我希望他们开始一一下载。
例如文件: 1.png , 2.png , 3.png
我希望按照我编写它们的相同顺序下载它们。
我怎么能用 NSUrlSession 做到这一点?
有几件事:
传统的 iOS 解决方案是将网络请求任务包装在异步Operation
子类中(例如,如本答案第 3 点中所述;请参阅本答案以了解该基础的另一种排列AsynchronousOperation
)。只需将队列设置maxConcurrentOperationCount
为1
,您就可以串行/顺序下载图像。
但是您真的不想这样做,因为您通过按顺序下载图像会付出巨大的性能损失。唯一应该按顺序执行网络请求的情况是,如果您在准备下一个请求时绝对需要一个请求的响应(例如,“登录请求”检索一个令牌,而随后的请求使用该令牌进行身份验证)。
但是,在处理一系列图像时,同时下载图像会快得多。将它们存储在字典(或其他任何东西)中:
var imageDictionary: [URL: UIImage] = [:]
然后:
imageDictionary[url] = image
然后,当您希望图像按原始 URL 数组的顺序排列时,您只需查找与 URL 关联的图像,例如:
let sortedImages = urls.compactMap { imageDictionary[$0] }
或者,您可能会完全重新考虑预先下载一系列图像的概念。例如,如果这些是表格视图中的图像视图,您可能只使用第三方库,例如Kingfisher,并使用它的UIImageView
方法setImage(with:)
:
let url = URL(string: "https://example.com/image.png")
imageView.kf.setImage(with: url)
这使您完全摆脱了获取图像和管理缓存、内存不足警告等的工作。这种即时模式可以产生更高性能的用户界面。即使你真的想提前下载它们(有点极端,所以确保你真的需要这样做),像 Kingfisher 这样的库也可以做到这一点。