0

我不知道如何一个一个地执行多个 NSUrlSession 任务。当第一个任务完成时启动第二个任务,当第二个任务完成时启动第三个任务等

例如,我想从 Web 服务下载多个文件。

我希望他们开始一一下载。

例如文件: 1.png , 2.png , 3.png

我希望按照我编写它们的相同顺序下载它们。

我怎么能用 NSUrlSession 做到这一点?

4

1 回答 1

1

有几件事:

  1. 传统的 iOS 解决方案是将网络请求任务包装在异步Operation子类中(例如,如本答案第 3 点中所述;请参阅本答案以了解该基础的另一种排列AsynchronousOperation)。只需将队列设置maxConcurrentOperationCount1,您就可以串行/顺序下载图像。

  2. 但是您真的不想这样做,因为您通过按顺序下载图像会付出巨大的性能损失。唯一应该按顺序执行网络请求的情况是,如果您在准备下一个请求时绝对需要一个请求的响应(例如,“登录请求”检索一个令牌,而随后的请求使用该令牌进行身份验证)。

    但是,在处理一系列图像时,同时下载图像会快得多。将它们存储在字典(或其他任何东西)中:

    var imageDictionary: [URL: UIImage] = [:]
    

    然后:

    imageDictionary[url] = image
    

    然后,当您希望图像按原始 URL 数组的顺序排列时,您只需查找与 URL 关联的图像,例如:

    let sortedImages = urls.compactMap { imageDictionary[$0] }
    
  3. 或者,您可能会完全重新考虑预先下载一系列图像的概念。例如,如果这些是表格视图中的图像视图,您可能只使用第三方库,例如Kingfisher,并使用它的UIImageView方法setImage(with:)

    let url = URL(string: "https://example.com/image.png")
    imageView.kf.setImage(with: url)
    

    这使您完全摆脱了获取图像和管理缓存、内存不足警告等的工作。这种即时模式可以产生更高性能的用户界面。即使你真的想提前下载它们(有点极端,所以确保你真的需要这样做),像 Kingfisher 这样的库也可以做到这一点。

于 2019-09-16T16:59:40.440 回答