【问题标题】:How do i make my cloudkit app load the data as its loading?如何让我的 cloudkit 应用程序在加载数据时加载数据?
【发布时间】:2015-06-17 21:55:25
【问题描述】:

在我正在制作的应用程序中,将有大量数据供应用程序从 iCloud 加载。我的问题是它不会将数据加载到集合视图中,直到它完成接收所有数据(这需要一段时间)。我希望应用程序在接收数据时将数据加载到集合视图中,因此用户不必等待。还是让应用程序一次只加载一些数据更好?我该怎么做呢?这是我用来加载数据的代码。

注意:我在这个项目中使用 swift。

  func loadInfo() {

        let predicate:NSPredicate = NSPredicate(value: true)
        let query:CKQuery = CKQuery(recordType: "Data", predicate: predicate)
        query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]




        if let database = self.publicDatabase {


            database.performQuery(query, inZoneWithID: nil, completionHandler: { (records:[AnyObject]!, error:NSError!) in

                if error != nil {

self.alert("Error: \(error.localizedDescription)", Message: "Make sure iCloud is turned on and you are connected to the internet")

                }
                else {



                    dispatch_async(dispatch_get_main_queue()) {

                        self.array.removeAll(keepCapacity: false)

                        for record in records {

                            let usernameRecord:CKRecord = record as CKRecord
                            self.array.append(usernameRecord.objectForKey("Info") as String)





                        }

                        //update data
                        self.collectionView.reloadData()

                    }


                }

                })

            }}

【问题讨论】:

  • 好问题。我也在找这个。

标签: ios swift icloud cloudkit icloud-api


【解决方案1】:

如果您执行 performQuery,记录将一次性返回。如果你想进步,那么你可以使用CKQueryOperation。然后,您将收到对该块的每条记录的调用:

 operation.recordFetchedBlock = { record in

当查询准备好时,就会调用到。

operation.queryCompletionBlock = { cursor, error in

返回的记录数将被限制为最大值(通常为 100)。可以使用以下方法设置该值:

operation.resultsLimit = CKQueryOperationMaximumResults;

只需将其设置为您想要的值。

这是一个基于以下评论链接的示例:

func loadInfo() {

    let p = NSPredicate(value: true)
    let q = CKQuery(recordType: "Data", predicate: p)
    q.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    let queryOperation = CKQueryOperation(query: q)
    let database = self.publicDatabase
    self.array.removeAll(keepCapacity: false)

    queryOperation.recordFetchedBlock = fetchedARecord

    queryOperation.queryCompletionBlock = { [weak self] (cursor : CKQueryCursor!, error : NSError!) in
        if error != nil {
            self.alert("Error: \(error.localizedDescription)", Message: "Make sure iCloud is turned on and you are connected to the internet")
        }
        else {
        if cursor != nil {
            println("there is more data to fetch")
            let newOperation = CKQueryOperation(cursor: cursor)
            newOperation.recordFetchedBlock = self!.fetchedARecord
            newOperation.queryCompletionBlock = queryOperation.queryCompletionBlock
            database.addOperation(newOperation)
            }
        } else {
            dispatch_async(dispatch_get_main_queue()) {
                self.collectionView.reloadData()
            }
        }

    }

    database.addOperation(queryOperation)
}

var i = 0
func fetchedARecord (record: CKRecord!) {
    println("\(NSDate().timeIntervalSinceReferenceDate*1000) \(++i)")
    self.array.append(record.objectForKey("Info") as String)
}

【讨论】:

  • nachson fertel,请参阅上面来自 CPPChase 的链接以获取示例代码
  • 我看到了链接,但这不是一个很好的例子。你能给我一个我在问题中显示的代码的例子吗?
  • A 在答案中添加了一个示例。这是上面链接中的示例与您的代码的快速合并。我希望我没有犯任何错误,因为它未经测试。
  • 使用上面的stackoverflow.com/questions/31503184/… 我认为只运行了 3 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多