CKRecord 获取键值

Joj*_*dmo 5 ios swift cloudkit ckrecord

我正在尝试根据用户的用户名获取用户的值。我能够使用以下方法获得正确的用户:

class func getByUsername(username: String, callback: (records: [CKRecord]) -> ()){
    getSummary(NSPredicate(format: "Username == %@", username)){(records: [CKRecord]) -> Void in
        callback(records: records)
    }
}

class func getSummary(predicate: NSPredicate, callback: (records: [CKRecord]) -> ()){
    let query = CKQuery(recordType: "UserInfo", predicate: predicate)
    let queryOperation = CKQueryOperation(query: query)
    queryOperation.desiredKeys = ["ID"]

    var records = [CKRecord]()
    queryOperation.recordFetchedBlock = {record in records.append(record)}
    queryOperation.queryCompletionBlock = {_ in callback(records: records)}

    CKContainer.defaultContainer().publicCloudDatabase.addOperation(queryOperation)
}
Run Code Online (Sandbox Code Playgroud)

然后我可以通过调用以下命令来获取正确的记录:

getByUsername("Username"){(records: [CKRecord]) -> Void in
  var record: CKRecord = records[0]
}
Run Code Online (Sandbox Code Playgroud)

我还可以通过使用获得正确的ID

var id: String = record.recordID.recordName
Run Code Online (Sandbox Code Playgroud)

所以我知道我正在获取正确的记录,但是,当我尝试从记录中获取值(例如用户的电子邮件)时,nil会返回:

var email: String = record.objectForKey("Email") as String
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

record.valueForKey("Email")
record.valueForKeyPath("Email")
Run Code Online (Sandbox Code Playgroud)

当我打印 时record.allKeys(),我得到一个空数组 ,[]当我打印 时record.allTokens(),我得到一个返回值nil

我是否没有正确从记录中获取值,或者我是否必须使用记录 ID 查询数据库以获取我想要获取的每个值?根据文档所说:

CKRecord 对象是键值对的字典,用于获取和保存应用程序的数据。

我假设我不必在数据库中查询我想要获取的每个值,并且这些值会在CKRecord获取后自动插入到iCloud

Edw*_*eer 4

当您省略该行时:

queryOperation.desiredKeys = ["ID"]
Run Code Online (Sandbox Code Playgroud)

查询将返回所有字段。

您没有收到 ID 字段可能是因为它是一个系统字段,可以使用

var ID = record.recordID.recordName 
Run Code Online (Sandbox Code Playgroud)