从 Parse 使用 countObjects(同步)的语法问题

Syntax trouble to use countObjects (synchronous) from Parse

下面是我的函数,我在其中突出显示了有效的代码(即异步),但我想要的是具有 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(...)

你应该永远不要网络同步。它会冻结界面,如果持续时间过长,WatchDog 进程会在用户眼前杀死您的应用程序。

如果您了解异步代码的工作原理并保持这种异步状态,那就更好了。您不能 return 以您正在执行的方式启动异步代码的代码中的值;在异步代码有机会将 violations 设置为任何值之前,您的 checkViolationStatus returns。相反,让 checkViolationStatus 接受调用者传递给您的 PFUser 和完成处理程序 。在异步块内,调用完成处理程序,将其交给 count.

以下是在 countObjects 中传递 NSError 的语法以及打印错误的代码,如果您收到一个错误:

var error: NSError?
violations = query.countObjects(&error)

if error != nil {
    print(error?.localizedDescription)
}

这里有一些解释可以帮助您进一步了解该错误类型。

NSErrorPointer 类型本质上与 Objective-C 中的 NSError** 相同,表示需要对象的地址,它实际所在的位置,而不仅仅是对象的指针来满足参数类型。这是 Objective-C.

中常见的错误处理模式

& 运算符允许您将这样的地址传递给函数。传入的参数可以修改,而不是仅限于函数的范围。这在 Swift 术语中称为输入输出参数,因为输入的内容也会输出。