Как заставить мое приложение cloudkit загружать данные при загрузке?

В приложении, которое я делаю, будет много данных для загрузки приложения из 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()

                    }


                }

                })

            }}

person nachshon f    schedule 12.04.2015    source источник
comment
хороший вопрос. Я тоже ищу это.   -  person CppChase    schedule 12.04.2015


Ответы (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)
}
person Edwin Vermeer    schedule 12.04.2015
comment
nachson fertel, см. ссылку выше от CPPChase для примера кода - person Edwin Vermeer; 13.04.2015
comment
Я видел ссылку, но это не хороший пример. Можете ли вы привести пример кода, который я показал в вопросе? - person nachshon f; 13.04.2015
comment
К ответу добавлен образец. Это быстрое слияние примера из приведенной выше ссылки с вашим кодом. Надеюсь, я не сделал никаких ошибок, так как это не проверено. - person Edwin Vermeer; 13.04.2015
comment
Используйте этот stackoverflow.com/ вопросов/31503184/ выше работает только я думаю, 3 раза. - person DogCoffee; 12.04.2016