0

嗨,我正在尝试制作一个小功能,该功能应该通过输入用户的姓名将与用户对应的记录发回给我。我创建了一个快速文件:

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)...
4

2 回答 2

0

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

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

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

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

还有一件事,performQuery 将异步执行。因此,您在 myRecord 尚未设置时返回它。您有 2 个选项。

  1. 您可以使用信号量使此方法同步。
  2. 您可以在传递代码块时调用该方法,而不是返回一个值。然后使用该记录调用该代码块。

选项 2 是首选方法。选项 1 将在 CloudKit 调用期间锁定您的应用程序。

于 2015-02-17T09:58:21.903 回答
0

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

record, error in

并在之前关闭

return myRecord 

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

于 2015-02-17T22:31:24.003 回答