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"(或者我需要的任何变量),但是当我需要在主线程上返回一些东西时我不能这样做.
有没有一个解决方案让我的应用程序等待返回而不阻塞主线程?我实际上并不认为在这种情况下没有重新设计大部分代码,但我只是想确保我不是天真的.
对于这些类型的问题,有哪些可接受的解决方案?
对此的正确解决方案是不要调用任何shouldPerformSegueWithIdentifier不能很快完成的任何事情(在几毫秒内).如果您需要执行一些可能需要几秒钟的网络请求,您应该:
退休shouldPerformSegueWithIdentifier;
从您的UI控件中删除segue到下一个场景;
相反,将按钮连接到@IBAction将以编程方式执行异步请求的按钮,并且只有在获得预期结果时,才能以编程方式手动执行segue(请参阅在Swift中以编程方式切换视图).