2015-01-01 7 views
6

Есть ли способ ограничить количество результатов, возвращаемых в CKQuery?Ограничить сумму результатов, полученных в CloudKit

В SQL можно выполнить запрос, например SELECT * FROM Posts LIMIT 10,15. Есть ли что-то вроде последней части запроса, LIMIT 10,15 в CloudKit?

Например, я хотел бы загрузить первые 5 результатов, после того как пользователь прокрутит вниз, я хотел бы загрузить следующие 5 результатов и так далее. В SQL это будет LIMIT 0,5, затем LIMIT 6,10 и так далее.

Одна вещь, которая будет работать, - использовать цикл for, но это было бы очень интенсивным, так как я должен был бы выбрать все значения из iCloud, а затем прокрутить их, чтобы выяснить, какие 5 выбрать, и Я ожидаю, что в базе данных будет много разных записей, поэтому я бы хотел загрузить только те, которые вам нужны.

Я ищу что-то вроде этого:

var limit: NSLimitDescriptor = NSLimitDescriptor(5, 10) 
query.limit = limit 

CKContainer.defaultContainer().publicCloudDatabase.addOperation(CKQueryOperation(query: query) 
//fetch values and return them 

ответ

8

Вы подадите CKQuery в CKQueryOperation. CKQueryOperation имеет концепции cursor и resultsLimit; они позволят вам объединить результаты вашего запроса. Как описано в документации:

Чтобы выполнить новый поиск:

1) Инициализировать объект CKQueryOperation с объектом CKQuery, содержащим критерии поиска и сортировки информации для записей, которые вы хотите.

2) Назначьте блок свойству queryCompletionBlock, чтобы вы могли обрабатывать результаты и выполнять операцию.

Если поиск дает много записей, операционный объект может доставить часть итоговых результатов сразу вашим блокам вместе с курсором для получения оставшихся записей. Если указатель установлен, использует его для инициализации и выполнения отдельного объекта CKQueryOperation , когда вы будете готовы обработать следующую партию результатов.

3) Необязательно настраивать результаты возврата, задавая значения для свойств результатов Limit и желаемых свойствKeys.

4) Передайте объект операции запроса методу addOperation: целевой базы данных , чтобы выполнить операцию против этой базы данных.

Так он выглядит:

var q = CKQuery(/* ... */) 
var qop = CKQueryOperation (query: q) 

qop.resultsLimit = 5 
qop.queryCompletionBlock = { (c:CKQueryCursor!, e:NSError!) -> Void in 
    if nil != c { 
    // there is more to do; create another op 
    var newQop = CKQueryOperation (cursor: c!) 
    newQop.resultsLimit = qop.resultsLimit 
    newQop.queryCompletionBlock = qop.queryCompletionBlock 

    // Hang on to it, if we must 
    qop = newQop 

    // submit 
    ....addOperation(qop) 
    } 
} 

....addOperation(qop) 
+0

я читал что-то подобное, но я могу сделать что-то вроде выбрать первые 5 значений, а затем, с помощью новой операции, пропустите первые 5 значения и выберите следующие 5? – Jojodmo

+0

Я обновил ответ (дайте мне пять минут). Это немного нереально, потому что он получает пять, а затем сразу еще пять. Вероятно, вы захотите получить следующие пять после прокрутки пользователя или некоторых таких. – GoZoner

+0

Хорошо, спасибо, поэтому я просто позвоню этому, а затем добавлю новую операцию, когда мне нужно загрузить следующие 5? – Jojodmo