как получить несколько типов записей, связанных через CKreference из облачного комплекта - PullRequest
3 голосов
/ 29 сентября 2019

Я создаю серию ссылок 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, поскольку именно здесь я должен вызывать вложенный код.

Кто-нибудь может посоветовать, как структурировать этот код простым и легким в использовании способом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...