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