【问题标题】:Should I use operation queue for this complete scenario?我应该在这个完整的场景中使用操作队列吗?
【发布时间】:2016-12-22 08:47:49
【问题描述】:

我需要通过以下步骤执行一个场景:

  1. 使用用户提供的一些搜索参数进行网络调用
  2. 然后,解析其 JSON 响应并创建模型实体
  3. 然后,对于创建的每个实体,如果它具有关联的图像 URL,则调用相应的服务来下载此类图像,并在下载完成时将其显示在 UICollectionView 中。

下载我需要的 N 个图像时,我需要处理并发网络调用。用户应该可以取消当前的搜索流程并开始一个新的搜索流程。另外,我应该考虑到某个图像的单元格尚未显示或已出列。所以,我的问题是:这将是最好的方法?

  • 直接使用URLSessionURLSessionDownloadTask执行第一次网络调用(无并发)和JSON响应解析,后续步骤使用OperationOperationQueue。如果用户想要取消当前搜索,请同时使用 invalidateAndCancel()cancelAllOperations() 作为 OperationQueue
  • 使用OperationOperationQueue 执行整个过程。
  • 还有其他更合适的方法吗?

【问题讨论】:

  • 对于后续的网络调用,因为它们之间没有使用 NSOperationQueue 的依赖关系或优先级(在这种情况下,我能想到的主要好处是依赖关系和优先级)我相信没有任何价值。您可以启动 NSURLSession 的多个数据任务,然后在 URLSession 上调用 invalidateAndCancel 是有意义的。然而,为了下载图像并在 CollectionView 中显示它,我更喜欢使用 SDWebImage。它会进行大量缓存,下载图像并自行更新 UI,从而有效地在 collectionView/tableView 中显示图像:D

标签: ios nsurlsession nsoperation nsoperationqueue nsurlsessiondownloadtask


【解决方案1】:

最好的方法是进行同步或异步调用来进行第一次服务调用。完成后,同步解析 json,然后使用延迟加载概念(异步调用)加载是否要下载任何图像以显示图像。

【讨论】:

  • 同步网络调用!!!嗯,这很有趣,NSURLSession 的哪个 API 进行了同步调用???据我所知,网络调用没有同步 API
  • 不是 NSURLSession。 NSURLSession 或 URLSession 完全是一个异步服务调用。您可以使用已过时的 NSURLConnection。虽然我不认为你需要这样做。
  • 对不起,也许我的问题的标题有点混乱......实际上我的问题是关于使用URLSessions 或(异步)Operationss
  • 用于服务调用的 URLSession 和用于下载图像的操作队列/URLSession。
【解决方案2】:

执行网络调用,然后制作模型对象。通过您的 API 完成块将这些返回给您的 VC。

然后重新加载您的集合视图并将 url 传递给每个单元格并让每个单元格自己担心,使用 SDWebImage 之类的东西在单元格中异步显示图像..

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2011-09-01
    • 2018-10-14
    • 2014-09-07
    • 2011-05-21
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多