買い物リストのアプリがあります。製品とベンダーごとの価格をアプリに保存できます。モデルは次のとおりです。
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() を使用する必要があると思いますが、最終的にどのように見えるかについて頭を悩ませることはできません。