用于从 cloudkit 检索单列的代码模式/片段

Posted

技术标签:

【中文标题】用于从 cloudkit 检索单列的代码模式/片段【英文标题】:Code pattern / snippet for retrieving single column from cloudkit 【发布时间】:2015-07-14 11:21:17 【问题描述】:

我正在构建一个允许用户从公共商店上传/下载信息的应用。我认为 cloudKit 存储非常适合这个。

我希望用户能够通过关键字字段在商店中搜索记录,然后在他们选择一条记录时下载整个记录。

用 SQL 术语来说是这样的:

SELECT id,KeyWords from myDB WHERE KeyWords LIKE %searchstring%

接着是:

SELECT * FROM myDB WHERE id = selectedID

我一直在使用此 Code Pattern 从 cloudKit 存储中检索记录:

var publicDatabase: CKDatabase?
let container = CKContainer.defaultContainer()

override func viewDidLoad() 
    super.viewDidLoad()
    publicDatabase = container.publicCloudDatabase


func performQuery()
    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "Library", predicate: predicate)
    publicDatabase?.performQuery(query, inZoneWithID: nil,
        completionHandler: (results, error in

        ...
        [code to handle results / error here]
        ...
    )

但这会返回所有每条记录的内容,这是很多不必要的信息。

我只想从 cloudkit 记录中获取一个字段。

有没有一种简单的方法可以做到这一点,有人有代码 sn-p 吗?

CKFetchRecordsOperation 允许下载受限列,但要求您知道要下载的记录的 ID。

【问题讨论】:

【参考方案1】:

为此,您可以在 CKQueryOperation 上使用 desiredKeys 属性。更多信息请见:desiredkeys documentation

【讨论】:

感谢您的建议。我设法拼凑一些东西并发布了答案。如果您不介意将目光投向它,我们将不胜感激。【参考方案2】:

好的,有什么工作了。这可能很老套,但我把它贴出来供处于相同情况的其他人参考...

let predicate = NSPredicate(value: true) // returns all - replace with whatever condition you want
let query = CKQuery(recordType: "Library", predicate: predicate) // create a query using the predicate
var operation = CKQueryOperation(query: query) // create an operation using the query
operation.desiredKeys = ["KeyWords"] // Array of whatever 'columns' you want to return
// operation.resultsLimit = 15 // optional limit on records

// Define a closure for what to do for each returned record
operation.recordFetchedBlock =  [weak self] (record:CKRecord!) in

    // Do whatever you want with each returned record  
    println(record.objectForKey("KeyWords"))



// Define a closure for when the operation is complete
operation.queryCompletionBlock =  [weak self] (cursor:CKQueryCursor!, error:NSError!) in

        if cursor != nil 
            // returns the point where the operation left off if you want t retrieve the rest of the records
        

        dispatch_async(dispatch_get_main_queue(),  () -> Void in

            // Do what you want when process complete
            self!.tableView.reloadData()
            if error != nil 
                println("there was an error")
            
        )
    

self.publicDatabase!.addOperation(operation) // Perform the operation on given database

【讨论】:

以上是关于用于从 cloudkit 检索单列的代码模式/片段的主要内容,如果未能解决你的问题,请参考以下文章

CloudKit - 无法从 iCloud 检索数据

从 CloudKit 检索新数据后更新 tableView 数据

如何使用objective-c从CloudKit中的资产字段中检索图像

使用 CloudKit 和 Swift 检索图像

如何从片段中检索gridview中的图像?

从模拟器查询公共数据库时出现 Cloudkit 错误