下面是我的功能,其中我突出了有效的代码(即异步),但我想要的是PFQuery.countObjects(error: NSErrorPointer)
同步代码。
//Count how many violations User has.
func checkViolationStatus(usr: PFUser) -> Int32 {
var violations: Int32 = 0
var query = PFQuery(className: PF_BLOCKEDUSERS_CLASS_NAME)
query.includeKey(PF_BLOCKEDUSERS_USER)
query.whereKey(PF_BLOCKEDUSERS_USER, equalTo: usr)
//THIS WORKS BUT IS ASYNCHRONOUS AND I WANT IT TO BE SYNCHRONOUS
// query.countObjectsInBackgroundWithBlock {
// (count: Int32, error: NSError?) -> Void in
// if error == nil {
// print("Sean has played \(count) games")
// violations = count
// }
// }
//WANT TO MAKE IT SYNCHRONOUS -- THIS DOES NOT WORK
violations = query.countObjects(<#T##error: NSErrorPointer##NSErrorPointer#>)
return violations
}
如何正确使用query.countObjects(...)
?
答案 0 :(得分:1)
你应该从不网络同步。它冻结了界面,如果持续时间过长,WatchDog进程会在用户非常睁眼之前杀死你的应用程序。
如果您将了解异步代码的工作方式并保持异步,那会更好。您无法从以您正在执行的方式启动异步代码的代码中返回值;在异步代码有机会将checkViolationStatus
设置为任何内容之前,您的violations
会返回。相反,让checkViolationStatus
获取调用者传递给您的PFUser 和完成处理程序。在异步块内部,调用完成处理程序,将其交给count
。
答案 1 :(得分:1)
以下是在NSError
中传递countObjects
的语法以及在收到错误时打印错误的代码:
var error: NSError?
violations = query.countObjects(&error)
if error != nil {
print(error?.localizedDescription)
}
这是一个小解释,可以帮助您进一步了解错误类型。
NSErrorPointer
类型与Objective-C中的NSError**
基本相同,并指示实现对象的地址,而不仅仅是对象的指针,以满足参数类型。这是Objective-C中常见的错误处理模式。
&
运算符允许您将此类地址传递给函数。传入的参数可以被修改,而不是仅限于函数的范围。这被称为Swift术语中的in-out参数,因为它的内容也会消失。