首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用以前CKQueryOperation的结果运行CKQueryOperation

使用以前CKQueryOperation的结果运行CKQueryOperation
EN

Stack Overflow用户
提问于 2020-08-04 07:48:32
回答 1查看 87关注 0票数 0

我有一个购物清单的应用程序。我可以在我的应用程序中存储每个产品和供应商的价格,模型是

代码语言:javascript
复制
Product
Vendor
Price

一个产品可以有来自不同供应商的多个价格。

我存储带有对产品和供应商(CKRecord.Reference)的引用的价格信息。

现在我正在使用下面的代码来获取与产品相关的所有价格:

代码语言:javascript
复制
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)中。

代码语言:javascript
复制
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(),但我不能理解它最终应该是什么样子。

EN

回答 1

Stack Overflow用户

发布于 2020-08-15 00:27:56

假设您使用上面的操作来获取价格。

代码语言:javascript
复制
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

然后你可以构造操作来获取供应商,我将创建简单的操作用于演示目的。

代码语言:javascript
复制
let vendorQuery = CKQuery(recordType: "Vendor", predicate: predicate)
    
let vendorsOperation = CKQueryOperation(query: vendorQuery)
vendorsOperation.database = publicDatabase // not required if you don't use OperationQueue

然后你可以设置依赖,首先获取比供应商价格更高的价格。

代码语言:javascript
复制
vendorsOperation.addDependency(pricesOperation)

最后,将这些操作提交给OperationQueue

代码语言:javascript
复制
let operationQueue = OperationQueue()
        
operationQueue.addOperations([pricesOperation, vendorsOperation], waitUntilFinished: false)

编辑:如果您不想使用OperationQueue,只需将这些操作提交到数据库,但在提交要执行的操作之前,请先设置依赖项。

代码语言:javascript
复制
vendorsOperation.addDependency(pricesOperation)
publicDatabase.add(pricesOperation)
publicDatabase.add(vendorsOperation)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63238410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档