Получить значение из CKRecord.Reference в CloudKit

У меня есть 2 типа записи: userDetails и запрос, в котором одно поле в запросе ссылается на userDetails. Мне интересно, если я получу запись из запроса, чтобы получить поле ссылки, а затем получу остальную часть значения из ссылки, которая доступна только в userDetails, таких как userName, будет ли это возможно? Или есть ли способ добиться этого, не выполняя другую выборку данных?

Я пробовал это:

CKContainer.default().publicCloudDatabase.fetch(withRecordID: CKRecord.ID(recordName: "0A38D024-C191-436E-8622-AE7527805CE8")) { (fetched, error) in
   if fetched != nil {
      let a = fetched?.value(forKey: "requesterReferenceId") as? CKRecord.Reference
      let b = a?.recordID.value(forKey: "userName") as? String
      print(b!)
  }
}

Но получил ошибку:

Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[‹CKReference 0x600002034280› valueForUndefinedKey:]: этот класс не соответствует кодированию значения ключа для ключа userName».

Благодарим за любую помощь и предложения.


person Faruuq    schedule 25.11.2020    source источник


Ответы (1)


Я предполагаю, что вы сохранили ссылку следующим образом:

let userDetail = CKRecord(recordType: "UserDetail")
let request = CKRecord(recordType: "Request")
let reference = CKRecord.Reference(recordID: userDetail.recordID, action: .deleteSelf)
request["requesterReferenceId"] = reference as CKRecordValue

Вы пытались использовать извлеченную ссылку в качестве предиката?

let publicDatabase = CKContainer.default().publicCloudDatabase
publicDatabase.fetch(withRecordID: CKRecord.ID(recordName: "0A38D024-C191-436E-8622-AE7527805CE8")) { (fetched, error) in
    if fetched != nil {
        if let reference = fetched?.value(forKey: "requesterReferenceId") as? CKRecord.Reference {
            let predicate = NSPredicate(format: "recordID == %@", reference)
            let query = CKQuery(recordType: "UserDetail", predicate: predicate)
            let queryOperation = CKQueryOperation(query: query)
            queryOperation.desiredKeys = ["list any keys you want to fetch here"]
            queryOperation.recordFetchedBlock = { (record: CKRecord?) -> Void in
                if let record = record {
                    print(record)
                }
                
            }
            
            queryOperation.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) -> Void in
                if let error = error {
                    print(error)
                    return
                }
                
            }
            publicDatabase.add(queryOperation)
        }
    }
}
person Kevvv    schedule 25.11.2020