2015-06-30 3 views
1

В этом случае - я использую простой UITableView, который отображает записи из CloudKit publicDB. Когда я запускаю приложение, операция запроса возвращает, например, возвращает 2 результата (это все, что у него есть в настоящее время).CloudKit - результаты CKQueryOperation разные при каждом запуске одного и того же запроса

В моем представлении таблицы есть элемент управления обновлением, и когда я пытаюсь обновить, я получил нулевые результаты, если я продолжу выполнять перезагрузки, в конечном итоге результат может выйти, но теперь всегда.

То же самое случается с большим количеством результатов, а также, я использовал, чтобы иметь тип 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 делает для добавления объектов в изменяемый массив, вид таблицы использует в качестве источника данных.

Я новичок в CloudKit, и я озадачен этим дизайном (не возвращая все результаты, но некоторые случайные), или я делаю что-то неправильно?

ответ

1

Я вижу, что вы используете курсор. из-за этого 2-й вызов начнется в том месте, где закончился первый вызов. У вас есть resultLimit 15. При использовании курсора вы будете получать только записи во второй раз, когда вы выполняете запрос, если было более 15 записей. Чтобы проверить, если это проблема, просто закомментируйте строку, в которой вы устанавливаете курсор: operation = CKQueryOperation (cursor: lastCursor)

+0

Hm, interesting, afaik, курсор возвращается только в том случае, если имеется больше результатов, чем предоставленный предел. Я никогда не думал, что это может быть так (не отлаживал курсор), сделал то, что вы предложили, и теперь его выглядит как работа ... очень странно ... Если этому курсору не нужно доверять, как я могу знаете, есть ли больше результатов, чем предел? – peerless

+0

Хм, нет, все еще проблема ... его не курсор – peerless

+0

Ах .. ты прав ... Курсор должен был быть ноль ... Но все равно вы всегда должны устанавливать его в возвращаемое значение в queryCompletionBlock. В противном случае он никогда не вернется в нуль и не будет трогать из предыдущего курсора, если бы было –

0

Я нашел проблему, я пытался сделать (в NSPredicate) радиус со значением Я читаю где-то в километрах. Поэтому я пытался запросить записи в 500 метрах вместо 500 километров, а файл GPX, который я использую в симуляторе, имеет несколько записей с большим расстоянием. Поскольку он имитирует движение, это было причиной того, чтобы не давать последовательных результатов.

Теперь, когда я использую правильное значение радиуса, все, кажется, просто отлично!

Смежные вопросы