首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift -从Cloudkit公共数据库获取所有记录

Swift -从Cloudkit公共数据库获取所有记录
EN

Stack Overflow用户
提问于 2018-11-24 20:15:25
回答 2查看 807关注 0票数 0

您好,我正在尝试从cloudkit中的publicDB中获取所有记录,目前有2000多条记录。如何获取它们并将它们放入一个数组中?我已经尝试了这两种方法,但都没有成功。你能帮帮我吗?

1种方法

代码语言:javascript
复制
    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "Position", predicate: predicate)
    query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

publicDB.perform(query, inZoneWith: nil) { (results, error) -> Void in            

        if error != nil {

            DispatchQueue.main.async(execute: {  () -> Void in
                self.delegate?.errorUpdating(error: error! as NSError)
                return
            })
        } else {
            self.positionArray.removeAll(keepingCapacity: true)

            for record in results! {

                let position = Position(record: record as CKRecord, database: self.publicDB)
                self.positionArray.append(position)

            }
        }

            DispatchQueue.main.async(execute: {  () -> Void in
               /* my elaboration with the complete result */
            })



    }

2方法

代码语言:javascript
复制
    let predicate = NSPredicate(value: true)   
    let query = CKQuery(recordType: "Position", predicate: predicate)

    query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    let qop  = CKQueryOperation(query: query)

    qop.resultsLimit = 3000        
    qop.recordFetchedBlock = { (record: CKRecord) in
        let position = Position(record: record, database: self.publicDB)
        self.positionArray.append(position)
        print(self.positionArray.count)
    }

    qop.queryCompletionBlock = { (cursor: CKQueryOperation.Cursor?, error: Error?) in
        DispatchQueue.main.async(execute: {  () -> Void in
        if let cursor = cursor {

            print("entro")
            let newOperation = CKQueryOperation(cursor: cursor)

            newOperation.recordFetchedBlock = qop.recordFetchedBlock
            newOperation.queryCompletionBlock = qop.queryCompletionBlock
            self.publicDB.add(newOperation)
        }

        else if let error = error {
            print("Error:", error)
        }
            // No error and no cursor means the operation was successful
        else {
            print("Finished with records:", self.positionArray)
            if(!all){
                // my elaboration
            }
            else{
                // my elaboration
            }
        }
        })
    }

    self.publicDB.add(qop)

使用第一种方法,我最多只能获取100条记录。使用第二种方法,我最多只能获取400条记录。但是我需要用2000多条记录填充我的数组,如何才能达到这个结果呢?

EN

回答 2

Stack Overflow用户

发布于 2020-02-08 10:09:20

请你试试这个吧!

var口哨= CKRecord

代码语言:javascript
复制
func loadWhistles(completionHandler: (() -> Void)?) {
    let pred = NSPredicate(value: true)
    let sort = NSSortDescriptor(key: nomeDaTabela, ascending: ordemDaTabela)
    let query = CKQuery(recordType: "Cliente", predicate: pred)
    query.sortDescriptors = [sort]        

    let operation = CKQueryOperation(query: query)
    operation.desiredKeys = ["Name"]
    operation.resultsLimit = 2000

    var newWhistles = Whistle

    operation.recordFetchedBlock = { record in
        newWhistles.append(record)

    }


    operation.queryCompletionBlock = { [unowned self] (cursor, error) in
        DispatchQueue.main.async {
            if error == nil {
                //ViewController.isDirty = false
                self.clienteRecords = newWhistles
                self.clientesTableView.reloadData()
            } else {
                let ac = UIAlertController(title: "Fetch failed", message: "There was a problem fetching the list of whistles; please try again: \(error!.localizedDescription)", preferredStyle: .alert)
                ac.addAction(UIAlertAction(title: "OK", style: .default))
                self.present(ac, animated: true)
            }
        }
    }


    PublicDatabase.add(operation)
    completionHandler?()

}
票数 1
EN

Stack Overflow用户

发布于 2018-11-25 01:29:30

每个fetch操作确实有400条记录的限制,因此您需要检查查询完成块返回的CKQueryCursor值,如果不是nil,则使用它CKQueryOperation(cursor: cursor)启动另一个操作。

所以原则上你的第二种方法是正确的。我猜你的问题是由线程问题引起的,尝试删除DispatchQueue.main.async(execute: { () -> Void in

附注:看看它是如何在RxCloudKit中完成的(它会自动处理大的获取),它绝对适用于获取1000+记录-- RecordFetcher.queryCompletionBlock(cursor: CKQueryCursor?, error: Error?)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53458052

复制
相关文章

相似问题

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