2015-01-01 33 views
6

是否有任何方法來限制在CKQuery中返回的結果數量?限制在CloudKit中返回的結果數量

SQL中,可以運行類似SELECT * FROM Posts LIMIT 10,15的查詢。有什麼和查詢的最後部分一樣,CloudKit中的LIMIT 10,15?例如,我想加載前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

您提交CKQueryCKQueryOperationCKQueryOperation具有cursorresultsLimit的概念;他們將允許您捆綁您的查詢結果。如文檔中所述:

要執行新的搜索:

1)初始化CKQueryOperation對象與含有 搜索標準和排序爲要記錄的信息的CKQuery對象。

2)將塊分配給queryCompletionBlock屬性,以便您可以 處理結果並執行操作。

如果搜索產生很多記錄,操作對象可能會立即將總計結果的 部分與 光標一起遞送到您的塊中,以獲取剩餘記錄。如果提供了遊標,則當您準備好處理下一批結果時, 會使用它來初始化並執行單獨的CKQueryOperation對象 。

3)可以通過指定 resultsLimit和desiredKeys屬性的值來配置返回結果。

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