Я создаю серию ссылок CK с контактом, имеющим несколько местоположений, каждое местоположение имеет поставщика, а каждый поставщик имеет счетчик и т. Д. Let self.currentLocationCkRecord ["ownningContact"] = CKReference (запись: self.currentContactCkRecord !,action: CKReferenceAction.deleteSelf)
let self.currentProviderCkRecord["ownningLocation"] = CKReference(record: self.currentLocationCkRecord!, action: CKReferenceAction.deleteSelf)
let self.currentMeterCkRecord["ownningProvider"] = CKReference(record: self.currentProviderCkRecord!, action: CKReferenceAction.deleteSelf)
when I retrieve all the records including referenced records I run into an issue if nesting code to get each of the referenced records
let predicate = NSPredicate(format: "TRUEPREDICATE")
let query = CKQuery(recordType: "Contact", predicate: predicate)
privateDB?.perform(query, inZoneWith: self.ckRecordZoneID) { (records, error) in
// handle error
if let records = records {
for aRecord in records {
// I process location CKRecord
self.alliCloudLocations.append(record)
let contactID = aRecord.recordID
let recordToMatch = CKReference(recordID: contactID, action: .deleteSelf)
let predicate = NSPredicate(format: "owningContact == %@", recordToMatch)
// Create the query object.
let query = CKQuery(recordType: Cloud.Entity.Location, predicate: predicate)
let ckQueryOpLocation = CKQueryOperation(query: query)
ckQueryOpLocation.queryCompletionBlock = { (cursor, error) in
print("Query completion block called")
guard error == nil else {
if let ckerror = error as? CKError {
self.aErrorHandler.handleCkError(ckerror: ckerror)
}
return
}
if cursor != nil {
let nextQueryOp = CKQueryOperation(cursor: cursor!)
nextQueryOp.recordFetchedBlock = = { (record: CKRecord) in
self.alliCloudLocations.append(record)
print(record)
// TO DO: I need to get a provider CKRecord and for each location CKRecord and for each provider CKRecord I ned to get a meter CKRecord
}
nextQueryOp.ZoneID = self.CKRecordZoneID
nextQueryOp.queryCompletionBlock = ckQueryOpLocation.queryCompletionBlock
nextQueryOp.desiredKeys = = ["locationName"]
nextQueryOp.desiredKeys = = ["zip"]
nextQueryOp.desiredKeys = = ["locationType"]
nextQueryOp.resultsLimit = ckQueryOpLocation.resultsLimit
//important
ckQueryOpLocation = nextQueryOp
privateDB.add(ckQueryOpLocation)
print("added next fetch")
}
}
}
}
// Add the CKQueryOperation to a queue to execute it and process the results asynchronously.
privateDB?.add(ckQueryOpLocation)
}
В приведенном выше коде для каждого контакта CKRecord я извлекаю местоположение CKRecords, а затем, как вы можете видеть из моего вышеприведенного оператора // TO DO comment: мне нужно вызватьв целом выполнить CKQuery и QueryCompletionBlock для каждой из упомянутых записей: провайдера и счетчика
У меня вопрос, когда я извлекаю местоположение CKRecord, извлекает ли оно всех упомянутых провайдера CKRecord и Meter CKRecord;если да, то как получить каждый из них, или мне нужно извлекать каждый из CKRecords провайдера и метра отдельно, и если это так, код очень усложняется внутри метода recordFetchedBlock, поскольку именно здесь я должен вызывать вложенный код.
Кто-нибудь может посоветовать, как структурировать этот код простым и легким в использовании способом?