iOS:强制取消NSOperationQueue中的操作

时间:2017-08-23 09:10:36

标签: ios swift nsoperation nsoperationqueue

我需要立即取消NSOperationQueue中的所有操作。

考虑我的情景,

我必须连续点击我的服务器,即只要用户在文本框中键入内容,我就会调用我的服务器。用户完成输入后,我必须打最后的api调用。所以我为单个API命中创建了一个NSOperation。用户在文本框中键入。我创建了NSOperation对象并在NSOperationQueue中添加它。在完全检测到用户的输入后,我取消了队列中的所有操作并点击了我的最终api。问题是某些操作不会立即取消。因此我的最终api命中不会立即调用。它等待一段时间(所有操作都必须完成),然后调用。

FYI,

myOperationQueue.cancelAllOperations()

在操作中启动方法我有这个代码

let session = URLSession.shared
let task = session.dataTask(with: urlRequest, completionHandler: { (data, urlResponse, error) -> Void in
})
task.resume()

请为我提供立即拨打最终API的最佳方式。

2 个答案:

答案 0 :(得分:2)

有关cancellAllOperations方法的Apple文档,它清楚地解释了您的情况。

  

取消操作不会自动将其从队列中删除或停止当前正在执行的操作。对于排队和等待执行的操作,队列必须仍然尝试执行操作,然后才能识别它被取消并将其移动到完成状态。对于已经执行的操作,操作对象本身必须检查取消并停止正在执行的操作,以便它可以移动到完成状态。在这两种情况下,完成(或取消)操作仍然有机会在从队列中删除之前执行其完成块。

答案 1 :(得分:1)

你也必须取消你的任务。

在Operation子类中实现取消覆盖。此覆盖也会取消该任务。

var task: URLSessionTask?

func scheduleTask() {
    let session = URLSession.shared

    ///Task is an instance variable 
    task = session.dataTask(with: urlRequest, completionHandler: { (data,     urlResponse, error) -> Void in
    })
    task?.resume()

}

public override func cancel() {
   task?.cancel()
   super.cancel()
}