从Parse使用countObjects(同步)的语法麻烦

时间:2015-10-18 23:20:38

标签: ios swift parse-platform pfquery

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

2 个答案:

答案 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参数,因为它的内容也会消失。