0

買い物リストのアプリがあります。製品とベンダーごとの価格をアプリに保存できます。モデルは次のとおりです。

Product
Vendor
Price

1 つの製品に、異なるベンダーの複数の価格が設定されている場合があります。

製品とベンダーへの参照とともに価格情報を保存します (CKRecord.Reference)。

現在、以下を使用して、製品に関連するすべての価格を取得しています。

public func fetchDataByProduct(product: Product, completionHandler: @escaping (Bool) -> Void){
        self.pricesBuffer = []

        let cloudContainer = CKContainer.init(identifier: "iCloud.XYZ")

        let publicDatabase = cloudContainer.publicCloudDatabase
        let reference = CKRecord.Reference(recordID: product.recordID, action: .deleteSelf)

        let predicate = NSPredicate(format: "priceToProduct == %@", reference)

        let query = CKQuery(recordType: "Price", predicate: predicate)

        let operation = CKQueryOperation(query: query)
        operation.recordFetchedBlock = { record in

            let price = Price()
            price.recordID = record.recordID

            price.grossPrice = record.object(forKey: "grossPrice") as? Double

            let dummy = record.object(forKey: "priceToVendor") as! CKRecord.Reference

            price.vendorRecordID = dummy.recordID
            self.pricesBuffer.append(price)
        }

        operation.queryCompletionBlock = { [unowned self] (cursor, error) in
            self.pricesBuffer.forEach({price in
                price.retrieveVendor()
            })

            DispatchQueue.main.async {
                if error == nil {
                    self.prices = self.pricesBuffer
                    completionHandler(true)
                } else {
                }
            }
        }
        publicDatabase.add(operation)
    }

私の問題は、Vendor オブジェクト (Vendor.name) の一部であるベンダー名を取得できないことです。

priceBuffer をループして価格ごとにこれを実行しようとしましたが、問題は CloudKit が最初に fetchDataByProduct() への最初の要求を完了し、その後ベンダー データをフェッチすることですが、更新されたデータが取得されないために遅すぎるようです。私のビュー(SwiftUI)にプッシュされました。

publicDatabase.fetch(withRecordID: self.vendorRecordID, completionHandler:  {[unowned self] record, error in
            if let record = record {
                print(record)
                self.vendor.recordID = record.recordID
                self.vendor.name = record["name"] as! String
                print(self.vendor.name)
            }
        })

これを解決する方法はありますか?ミックスに 2 番目の CKQueryOperation を追加して .addDependency() を使用する必要があると思いますが、最終的にどのように見えるかについて頭を悩ませることはできません。

4

1 に答える 1