gpt4 book ai didi

ios - Swift:如果在 PFQuery 完成之前再次运行函数,如何取消 PFQuery?

转载 作者:搜寻专家 更新时间:2023-11-01 05:58:30 25 4
gpt4 key购买 nike

抱歉,我想不出更好的标题方式。

基本上我有一个连接到 Parse 的应用程序。我已经指定了一个 Action ,它在文本字段更改时运行(即当用户键入字母时)

在此操作中,我调用 PFQuery 进行解析,然后我要求它查找 ObjectsInBackgroundWithBlock。

问题是,如果用户在此查询运行完成之前键入另一个字母,则现在有 2 个查询正在运行,并且两个查询的结果最终都会填充到 tableView 中。

所以我的问题很简单,如果用户在第一个 findObjectsInBackgroundWithBlock 完成之前输入另一个字母,我将如何取消第一个并运行新的字母?

我尝试在操作开始时插入 PFQuery.cancel(query),但是代码变得困惑,因为当操作第一次运行时还没有运行查询。

我的代码,可能有帮助:

@IBAction func textFieldChanged (sender: AnyObject) {
let query = PFUser.Query()
query!.whereKey("Postcode", containsString: searchField.text)
query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
if let objects = objects {
for object in objects {
self.citiesArray.append(object["city"] as! String)
}
}
})

非常感谢您的耐心等待!

最佳答案

您可以尝试将这些请求包装在 NSOperation 中并将它们添加到专用的(用于此类搜索请求)NSOperationQueue 并调用 cancelAllOperations()当输入新字符时。

NSOperation 的内部 Parse block 中检查 self.cancelled 并在取消时不执行任何操作返回。应该工作正常。

更新:

class ViewController: UIViewController {    @IBOutlet weak var searchField: UITextField!    var citiesArray = [String]()    lazy var textRequestQueue: NSOperationQueue = {        var queue = NSOperationQueue()        queue.maxConcurrentOperationCount = 1        queue.qualityOfService = NSQualityOfService.UserInteractive        return queue        }()    @IBAction func textFieldChanged(sender: AnyObject) {        textRequestQueue.cancelAllOperations()        let query = PFQuery()        query.whereKey("Postcode", containsString: searchField.text)        textRequestQueue.addOperation(TextRequestOperation(query: query, resultBlock: { (objects, error) -> Void in            if let objects = objects {                for object in objects {                    self.citiesArray.append(object["city"] as! String)                }            }        }))    }}class TextRequestOperation: NSOperation {    typealias ResultBlock = ((result: String)->())    var _resultBlock: PFArrayResultBlock    var _query: PFQuery    init(query: PFQuery, resultBlock: PFArrayResultBlock) {        self._resultBlock = resultBlock        self._query = query    }    override func main()    {        if self.cancelled { return }        _query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in            if self.cancelled { return }            self._resultBlock(objects, error)        }    }}

关于ios - Swift:如果在 PFQuery 完成之前再次运行函数,如何取消 PFQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31788957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com