performQuery,无法将inZoneWithID设置为nil

时间:2015-02-16 21:29:58

标签: swift cloudkit ckquery

您好我正在尝试创建一个小函数,它应该通过输入他/她的名字将我发回给用户的记录。我创建了一个swift文件:

import Foundation
import CloudKit
import UIKit


func getGetMainUser(name : String) -> CKRecord {
var myRecord : CKRecord!
let container = CKContainer.defaultContainer()
let publicDB = container.publicCloudDatabase
let predicate = NSPredicate(format: "nickName == name")
let query = CKQuery(recordType: "usersAtributes", predicate: predicate)

publicDB.performQuery(query, inZoneWithID: nil) {
    record, error in {
        if error != nil {
            println(error.localizedDescription)
        } else {
            if record.count == 1 {
                myRecord = record[0] as CKRecord
            }
        }
    }
}
return myRecord
}

我不能理解的是,由于performQuery的inZoneWithID的nil值,我无法编译此代码。虽然它在我的代码的其他部分中有效,但此语法可能不正确。 这是我得到的错误:

Cannot convert the expression's type '(CKQuery!, inZoneWithID: NilLiteralConvertible, ((ST5,(ST5,ST6) -> (ST5, ST6) -> ST4) -> (ST5,(ST5,ST6)-> ST4) -> ST4,((ST5,ST6) -> (ST5,ST6)...

2 个答案:

答案 0 :(得分:0)

您的问题不是zoneID。该文档说明了这一点:

  

要搜索的区域的ID。搜索结果仅限于记录   指定的区域。指定nil以搜索默认区域   数据库中。

这个谓词是错误的。它应该是:

NSPredicate(格式:" nickName =%@",名称)

另外一件事,performQuery将以异步方式执行。因此,在尚未设置的情况下,您将返回myRecord。你有2个选择。

  1. 您可以使用信号量使此方法同步。
  2. 您可以在传递代码块时调用该方法,而不是返回值。然后用该记录调用该代码块。
  3. 选项2是首选方法。选项1将在CloudKit调用期间锁定您的应用程序。

答案 1 :(得分:0)

好吧,我终于找到了我的(新手)错误: 我添加了两个额外/无用的括号,导致错误。

后立即开幕
record, error in

并在

之前关闭
return myRecord 

现在我已经删除了它们,一切都很好。谢谢Edwin,你的有用答案将帮助我很多代码编译。