【问题标题】:iOS: Force to cancel Operation in NSOperationQueueiOS:强制取消 NSOperationQueue 中的操作
【发布时间】:2017-08-23 09:10:36
【问题描述】:

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

【问题讨论】:

    标签: ios swift nsoperation nsoperationqueue


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,所以对于我的场景我不能使用nsoperation?
    • 那么什么是立即达到最终 api 的最佳方式。
    • 我需要取消所有 URL 命中
    • 我希望您指的是“URL 点击”中的“请求”。您可以为文本输入请求操作设置低优先级,而为最终请求操作设置高优先级。这将使最终请求操作仅等待当前执行的操作,并将在队列中排在第一位。但是,如果您解释为什么要为文本输入中的每个文本更改发送请求,那仍然会很好,也许会出现更好的解决方案;)
    【解决方案2】:

    你也必须取消你的任务。

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

    【讨论】:

    • 谢谢@jarora。即使没有立即调用我的最终 API 命中,我也尝试过。大约 20 秒后,我调用了最终的 API。
    • 如果这解决了你的问题,你可以接受这个答案。
    • 不,我无法解决这个问题。我减少了“操作”创建的数量并解决了缓慢的问题。例如,以前如果用户输入 100 个字符,我会创建 100 个操作,现在我将为 100 个字符创建大约 20 个操作。
    猜你喜欢
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多