仅获取 cloudkit 中的特定字段?

Posted

技术标签:

【中文标题】仅获取 cloudkit 中的特定字段?【英文标题】:Fetch only specific fields in cloudkit? 【发布时间】:2017-02-22 18:53:59 【问题描述】:

我只想获取 CloudKit 中音乐记录中的 Song_Name 字段。我正在尝试下面的代码,但它仍然会获取音乐记录中的所有字段。我想我需要使用 publicDB.add(operation) 方法编译操作,但它不允许我像现在使用 publicDB.perform(query, in....) 那样声明“结果”

 let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "Musics", predicate: predicate)
    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["Song_Name"]

    publicDB.perform(query, inZoneWith: nil)  [unowned self] results, error in

        guard error == nil else 
            DispatchQueue.main.async 
                self.delegate?.errorUpdating(error! as NSError)
                print("Cloud Query Error - Refresh: \(error)")
            
            return
        
        self.items_music.removeAll(keepingCapacity: true)
        for record in results! 
            let music = Musics(record: record, database: self.publicDB)
            self.items_music.append(music)
        
        DispatchQueue.main.async 
            self.delegate?.modelUpdated()
        
    

【问题讨论】:

请定义“不工作”。这是程序员可以使用的最无用的短语。请明确点。编译的时候会报错吗?它会崩溃吗?它根本不符合您的期望吗? Edit 带有错误消息或调试信息的问题。清楚地解释你的代码实际上做了什么,并清楚地解释你期望它做什么。让人们可以轻松地帮助您。不要在 cmets 中发布此信息。请edit您的问题提供相关细节。 @rmaddy 我编辑了描述,是的,我现在注意到了。很抱歉。 【参考方案1】:

您正在创建CKQueryOperation 并设置操作的desiredKeys 属性,但是您没有使用此操作。您只需对数据库执行查询,因此不会使用任何查询操作的属性。

您需要为您的操作分配一个记录获取块和查询完成块,然后将该操作添加到数据库中以实际运行它。

let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "Musics", predicate: predicate)
let operation = CKQueryOperation(query: query)
operation.desiredKeys = ["Song_Name"]
var newItems = [Musics]()
operation.queryCompletionBlock = (  (cursor, error)->Void in
    guard error == nil else 

        DispatchQueue.main.async 
            self.delegate?.errorUpdating(error! as NSError)
            print("Cloud Query Error - Refresh: \(error)")
        
        return
    
    self.items_music = newItems
    DispatchQueue.main.async 
        self.delegate?.modelUpdated()
    
)

operation.recordFetchedBlock = (  (record) -> Void in
    let music = Musics(record: record, database: self.publicDB)
    newItems.append(music)
)

publicDB.add(operation)

我省略了一些您需要检查提供给完成块的cursor 的代码。如果这不是nil,那么您需要发出另一个查询来获取其他项目

【讨论】:

operation.recordFetchedBlock 行给出此错误“无法分配类型'(() -> Void, Void)'的值(又名'(() -> (), ())') 输入 '((CKRecord) -> Void)?'" 我的最后一条评论。这是工作。只是在 operation.recordFetchedBlock 函数之后缺少一个“)”。

以上是关于仅获取 cloudkit 中的特定字段?的主要内容,如果未能解决你的问题,请参考以下文章

从 CloudKit 中的 CKRecord.Reference 获取价值

从 CloudKit 和 Swift 3 中的表/RecordType 计算字段的总和,例如特定 Customer_Name 的 Bill_Amount

如何从Swift中的Cloud FireStore Firebase访问特定字段

Cloudkit 返回具有特定字符串的记录

CloudKit 仅获取第一条记录

CKAsset 未保存到 CloudKit - 保存所有其他字段