CloudKit - 每次运行相同的查询时,CKQueryOperation结果都不同

时间:2015-06-30 07:34:54

标签: swift cloudkit ckquery

就是这种情况 - 我正在使用一个简单的UITableView来呈现CloudKit publicDB中的记录。当我运行应用程序时,查询操作返回例如返回2个结果(这就是它当前所有的结果)。

我的表视图有一个刷新控件,当我拉到刷新时,我得到零结果,如果我继续重新加载,最终结果可能会出现但现在总是。

同样的事情发生了更多的结果,我曾经有过CKLocation类型,我查询过,响应总是不同,没有任何常识

一些示例代码(在这种情况下谓词是TRUEPREDICATE - 没什么特别的):

    let sort = NSSortDescriptor(key: "creationDate", ascending: false)        
    let query = CKQuery(recordType: "Tests", predicate: DiscoveryMode.getPredicate())
    query.sortDescriptors = [sort]

    var operation = CKQueryOperation(query: query)
    if lastCursor != nil {
        operation = CKQueryOperation(cursor: lastCursor)
    }

    operation.resultsLimit = 15
    operation.recordFetchedBlock = recordFetchBlock
    operation.queryCompletionBlock = { [weak self] (cursor:CKQueryCursor!, error:NSError!) in

        if cursor != nil {
             self!.lastCursor = cursor
        }

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

            Misc.hideLoadingInView(view: self!.view)

            self!.tableView.reloadData()
            self!.refreshControl.endRefreshing()

            if error != nil {
                Misc.showErrorInView(view: self!.view, message: error.localizedDescription)
            }
        })
    }

    CloudKit.sharedInstance.publicDB.addOperation(operation)

所有 recordFetchBlock 的作用是将对象添加到表视图用作dataSource的可变数组中。

我是CloudKit的新手,我很困惑,这是设计的(不是所有的结果,而是一些随机的)或者我做错了什么?

2 个答案:

答案 0 :(得分:1)

我看到你正在使用光标。因为第二次通话将在第一次通话结束时开始。您的resultsLimit为15.使用游标时,如果有超过15条记录,则只会在第二次执行查询时收到记录。要测试这是否是问题,只需注释掉设置光标的行:operation = CKQueryOperation(cursor:lastCursor)

答案 1 :(得分:0)

我发现了这个问题,我试图做(在NSPredicate中)一个半径,我读到的某个值以千米为单位。因此,我试图查询500米而不是500公里内的记录,我在模拟器中使用的GPX文件有多个距离较大的记录。由于它模拟了运动,因此不能获得一致的结果。

现在,当我使用适当的半径值时,似乎一切都很好!