ios - 按顺序执行 swift nsurlsession 任务

标签 ios swift grand-central-dispatch nsurlsession nsurlsessiontask

我不会一个一个执行多个NSUrlSession任务。当第一个任务完成时启动第二个任务,当第二个任务完成时启动第三个任务等

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

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

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

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

我如何使用 NSUrlSession 做到这一点?

最佳答案

一些事情:

  1. 传统的 iOS 解决方案是将网络请求任务包装在异步 Operation 子类中(例如,this answer 的第 3 点中概述的;参见 this answer 的另一种排列基 AsynchronousOperation)。只需将队列的 maxConcurrentOperationCount 设置为 1 即可连续/顺序下载图像。

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

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

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

    然后:

    imageDictionary[url] = image
    

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

    let sortedImages = urls.compactMap { imageDictionary[$0] }
    
  3. 或者,您可能会完全重新考虑预先下载一系列图像的概念。例如,如果这些是表格 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/

相关文章:

iOS打开谷歌地图路线

ios - 如何在 SwiftUI 中的两个 View 模型之间共享已发布的模型?

ios - 从 firebase 存储中检索图像以显示在 tableView 单元格上

ios - Swift 中 UIScrollView 内的 UIPanGesture

swift - 如何使用 RxSwift 获取分页页面的所有页面 url

iphone - NSMutableURLRequest 和 NSURLConnection 无法在 GCDdispatch_async 中工作?

ios - 将 block 并发插入并发队列

ios - 在哪里可以获得 UISearchBar 中使用的放大镜图标?

Xcode 7.0 启动图像集 "LaunchImage"有 2 个未分配的 child

objective-c - 主线程中的 dispatch_get_main_queue()