我需要立即取消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的最佳方式。
答案 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()
}