2015-01-01 10 views
6

Gibt es eine Möglichkeit, die Anzahl der Ergebnisse zu begrenzen, die in einem CKQuery zurückgegeben werden?Beschränken Sie die Anzahl der in CloudKit zurückgegebenen Ergebnisse.

In SQL ist es möglich, eine Abfrage wie SELECT * FROM Posts LIMIT 10,15 auszuführen. Gibt es in CloudKit so etwas wie den letzten Teil der Abfrage, LIMIT 10,15?

Zum Beispiel möchte ich die ersten 5 Ergebnisse laden, dann, sobald der Benutzer scrollt, möchte ich die nächsten 5 Ergebnisse laden, und so weiter. In SQL wäre es LIMIT 0,5, dann LIMIT 6,10, und so weiter.

Eine Sache, die funktionieren würde, ist eine for-Schleife zu verwenden, aber es wäre sehr intensiv, da ich alle Werte aus iCloud auswählen und dann durch sie durchlaufen müsste, um herauszufinden, welche 5 auszuwählen und Ich erwarte, dass es viele verschiedene Posts in der Datenbank gibt, also möchte ich nur diejenigen laden, die benötigt werden.

Ich bin auf der Suche nach so etwas wie folgt aus:

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

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

Antwort

8

Sie Ihre CKQuery zu einem CKQueryOperation einreichen. Die CKQueryOperation hat Konzepte von cursor und von resultsLimit; Mit ihnen können Sie Ihre Abfrageergebnisse bündeln. Wie in der Dokumentation beschrieben:

Um eine neue Suche durchführen:

1) Initialisieren eines CKQueryOperation Objekt mit einem CKQuery Objekt enthält die Suchkriterien und Sortierinformationen für die Datensätze, die Sie wollen.

2) Weisen Sie der Eigenschaft queryCompletionBlock einen Block zu, damit Sie die Ergebnisse verarbeiten und den Vorgang ausführen können.

Wenn die Suche viele Datensätze ergibt, kann das Operationsobjekt einen Teil der Gesamtergebnisse sofort an Ihre Blöcke liefern, zusammen mit einem Cursor zum Abrufen der verbleibenden Datensätze. Wenn ein Cursor angegeben wird, verwenden Sie , um ein separates CKQueryOperation-Objekt zu initialisieren und auszuführen, wenn Sie bereit sind, den nächsten Stapel von Ergebnissen zu verarbeiten.

3) Konfigurieren Sie optional die Rückgabeergebnisse, indem Sie Werte für die resultLimit- und sinedKeys-Eigenschaften angeben.

4) Übergeben Sie das Abfrageoperationsobjekt an die addOperation: -Methode der Zieldatenbank , um den Vorgang für diese Datenbank auszuführen.

So wie es aussieht:

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

ich über so etwas wie dieses gelesen haben, aber ich kann etwas tun, wie die ersten 5 Werte auswählen, und dann mit einem neuen Betrieb, lassen Sie die ersten 5 Werte und wählen Sie die nächsten 5? – Jojodmo

+0

Ich habe die Antwort aktualisiert (gib mir fünf Minuten). Es ist ein wenig unrealistisch, weil es fünf und dann gleich fünf weitere bringt. Sie möchten wahrscheinlich die nächsten fünf nach dem Benutzer scrollt oder etwas ähnliches. – GoZoner

+0

Ok, danke, also rufe ich das mal an, und füge dann die neue Operation hinzu wenn ich die nächsten 5 laden muss? – Jojodmo

Verwandte Themen