繁体   English   中英

iOS:强制取消NSOperationQueue中的操作

[英]iOS: Force to cancel Operation in NSOperationQueue

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

考虑我的情景,

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

仅供参考,

myOperationQueue.cancelAllOperations()

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

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

请提供最好的方法立即调用我的最终API。

关于cancellAllOperations方法的苹果文档,它清楚地解释了你的情况。

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

你也必须取消你的任务。

在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()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM