我有一个购物清单的应用程序。我可以在我的应用程序中存储每个产品和供应商的价格,模型是
Product
Vendor
Price一个产品可以有来自不同供应商的多个价格。
我存储带有对产品和供应商(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.name)的一部分。
我试图遍历pricesBuffer并按价格运行这个请求,但问题似乎是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)
}
})有什么办法解决这个问题吗?我相信我必须在混合中添加第二个CKQueryOperation并使用.addDependency(),但我不能理解它最终应该是什么样子。
发布于 2020-08-15 00:27:56
假设您使用上面的操作来获取价格。
let predicate = NSPredicate(format: "priceToProduct == %@", reference)
let query = CKQuery(recordType: "Price", predicate: predicate)
let pricesOperation = CKQueryOperation(query: query)
pricesOperation.database = publicDatabase // not required if you don't use OperationQueue然后你可以构造操作来获取供应商,我将创建简单的操作用于演示目的。
let vendorQuery = CKQuery(recordType: "Vendor", predicate: predicate)
let vendorsOperation = CKQueryOperation(query: vendorQuery)
vendorsOperation.database = publicDatabase // not required if you don't use OperationQueue然后你可以设置依赖,首先获取比供应商价格更高的价格。
vendorsOperation.addDependency(pricesOperation)最后,将这些操作提交给OperationQueue
let operationQueue = OperationQueue()
operationQueue.addOperations([pricesOperation, vendorsOperation], waitUntilFinished: false)编辑:如果您不想使用OperationQueue,只需将这些操作提交到数据库,但在提交要执行的操作之前,请先设置依赖项。
vendorsOperation.addDependency(pricesOperation)
publicDatabase.add(pricesOperation)
publicDatabase.add(vendorsOperation)https://stackoverflow.com/questions/63238410
复制相似问题