等待在调度异步操作的函数中返回(Swift + Parse)

Lul*_*Cow 1 multithreading ios parse-platform swift

这是执行异步块的一个基本问题,我还没有找到一个好的解决方案.

以下代码有效,但它阻止了主线程,我想避免这种情况.

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
    //check if transaction already exists
    let trans = PFQuery(className: "Transactions")
    trans.whereKey("itemId", equalTo: self.pfObject.objectId!)

   //I need the count of objects in the query before I can proceed, but I don't want to block the main thread
   let count = trans.countObjects()
   if(count > 0){
        return false
    }else{
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

此问题并非特定于我的应用程序的这一部分.通常,我可以在query.countObjectsInBackGroundWithBlock()之类的闭包中设置"count"(或者我需要的任何变量),但是当我需要在主线程上返回一些东西时我不能这样做.

有没有一个解决方案让我的应用程序等待返回而不阻塞主线程?我实际上并不认为在这种情况下没有重新设计大部分代码,但我只是想确保我不是天真的.

对于这些类型的问题,有哪些可接受的解决方案?

Rob*_*Rob 5

对此的正确解决方案是不要调用任何shouldPerformSegueWithIdentifier不能很快完成的任何事情(在几毫秒内).如果您需要执行一些可能需要几秒钟的网络请求,您应该:

  • 退休shouldPerformSegueWithIdentifier;

  • 从您的UI控件中删除segue到下一个场景;

  • 相反,将按钮连接到@IBAction将以编程方式执行异步请求的按钮,并且只有在获得预期结果时,才能以编程方式手动执行segue(请参阅在Swift中以编程方式切换视图).