【问题标题】:Any ideas to cancel a function in the middle? Swift iOS有什么想法可以取消中间的功能吗?斯威夫特 iOS
【发布时间】:2017-01-23 07:42:45
【问题描述】:

当用户在UICollectionView 中选择一个单元格时,我调用一个网络任务来获取一些 JSON。这是asynchronous,因此在检索数据时 UI 保持活动状态。允许用户在UICollectionView 中选择另一个单元格。我不想停止这个,但我确实想要一种方法来取消第一个函数调用并为现在选择的单元格调用新方法。

有没有办法在didDeselectItemAt indexPath: 中取消任何当前正在执行的任务?

我正在考虑在 UI 上放置一个“请稍候”模式视图,这将阻止第二个单元格选择,直到函数返回。这是我最好的选择还是有更好的方法?

【问题讨论】:

  • 如果你使用的是NSOperationqueue,你可以取消。

标签: ios swift uicollectionview cancellation


【解决方案1】:

您可以使用 NSOperationQueue 创建和跟踪异步请求,并在必要时取消它们。

在此处查看其他问题的答案: GCD cancel async block?

【讨论】:

    【解决方案2】:

    通过使用NSOperationQueue 维护单独的线程,可以在执行过程中控制任务,而GCD 不允许这样做,但两者都适用于特定任务机制的后台和前台执行。

    • GCD 是一种轻量级的方式来表示将要同时执行的工作单元。您不安排这些工作单元;系统会为您安排时间。

    • NSOperation 与 GCD 相比增加了一点额外开销,但您可以在各种操作之间添加依赖关系并重用、取消或暂停它们。

    示例:

    var backgroundQueue = NSOperationQueue()
        backgroundQueue.addOperationWithBlock(){
            println("hello from background")
            NSOperationQueue.mainQueue().addOperationWithBlock(){
                self.theLabel.text = "updated from main thread"
            }
        }
    

    现在可以通过NSOperationQueuebackgroundQueue 变量进行各种操作。

    【讨论】:

    • +1 用于解释为什么 GCD 可能不是这里的最佳解决方案。另请参阅此答案以简要比较 NSOperation 和 GCD:stackoverflow.com/a/10375616/563802
    • addOperationWithBlock() 创建一个 NSOperation,其任务无法取消。也就是说,您提出的解决方案无法解决 OPs 问题。
    【解决方案3】:

    您可以将您的网络任务以NSOperations 的身份提交给NSOperationQueue

    NSOperation 有一个取消方法,NSOperationQueue 有一个cancelAllOperations 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-07-22
      • 2017-03-24
      相关资源
      最近更新 更多