Core Data: Unterbrechen Sie das Ausführen von NSFetchRequest

8

Dafür habe ich hoch und niedrig gesucht:

Gibt es in Core Data eine Möglichkeit, NSFetchRequest zu unterbrechen / anzuhalten / abzubrechen und auszuführen?

Ich führe eine inkrementelle Suche in einer iPhone-App durch und habe jede Art der Optimierung versucht, aber es ist nicht genug (ich habe 42.000 Datensätze), also muss ich es in einer NSOperation ausführen. Wenn ein neues Zeichen eingegeben wird, muss ich das vorherige fetchRequest abbrechen, aber [nsoperation cancel] tut nichts.

Ein anderer Ansatz könnte sein, das Feld, in dem ich suche, in einen anderen unterbrechbaren Index zu verschieben, vielleicht im Speicher oder vielleicht in einer separaten sqlite3-Datenbank, die mit sqlite_interrupt unterbrechbar zu sein scheint.

    
mclin 09.01.2011, 09:10
quelle

4 Antworten

2

Meine Lösung bestand darin, die Abfragevorgänge weiterlaufen zu lassen, aber zu überprüfen, ob sie abgebrochen wurden, bevor das Ereignis zur Aktualisierung der Benutzeroberfläche gesendet wurde.

Dies ist nicht perfekt, weil Sie immer noch viele Abfrageoperationen ausführen können, deren Ergebnisse niemals verwendet werden, aber immer noch ein wenig schneller.

    
mclin 06.06.2011, 14:30
quelle
14

Die direkte Antwort auf Ihre Frage ist nein. Ihre beste Option, mit Ihrem aktuellen Design ist es, sie in einer Operation zu tun, aber dann haben Sie die Thread-Barriere, um sich sorgen und verlangsamen Sie sich. Denken Sie daran, dass, wenn Ihre Operationen nicht im Hauptthread ausgeführt werden, Sie ein separates NSManagedObjectContext für die Operation benötigen oder Threading-Probleme auftreten.

Bessere Frage: Warum machen Sie einen neuen Abruf für jedes Zeichen?

Wenn Sie bereits die Abrufergebnisse einer vorherigen Suche haben und der Benutzer kein Zeichen entfernt hat, nehmen Sie einfach die vorhandenen Ergebnisse und führen Sie Ihr Prädikat für NSArray aus. Dadurch wird die Suche weiter verfeinert, anstatt jedes Mal auf die Festplatte zu gehen. Da es im Speicher ist, wird es extrem schnell sein.

Berücksichtigen Sie beim Implementieren eines Suchfelds die folgenden Optionen:

  • Schlagen Sie die Festplatte nur auf das erste Zeichen
  • Schlagen Sie die Festplatte nur, wenn ein Zeichen aus dem Suchfeld gelöscht wurde
  • Erwägen Sie, die objectID und die durchsuchbare Eigenschaft im Voraus zu laden, um Festplattentreffer zu vermeiden.

Je nachdem, was Sie suchen (und es gibt Möglichkeiten, den Core Data Store zu renormieren, um die Suche zu verbessern), können Sie einiges in den Speicher laden. Selbst bei 42K-Datensätzen, wenn die Sucheigenschaften klein genug sind, können Sie sie alle in den Speicher laden.

Wahrscheinlich müssen Sie trotzdem für diesen Anwendungsfall testen, wenn der Benutzer mit "A" beginnt.

Welcher Teil von NSFetchRequest ist langsam? Auf die SQLite-Datenbank zugreifen oder die Daten in den Speicher laden? Basierend auf Ihrer Antwort können Sie die Suchleistung direkt verbessern.

    
Marcus S. Zarra 20.12.2013 02:06
quelle
2

Kurze Antwort - nein, nicht direkt, Entschuldigung.

Lange Antwort - Ja, aber Sie müssen ziemlich viel tun oder arbeiten, um es zu tun

Sie müssen es in einem Hintergrund-Thread ausführen (was so klingt, als würden Sie bereits über NSOperation arbeiten)

Legen Sie in Ihrem Abruf das Limit fest, um 20 Ergebnisse gleichzeitig zu erhalten, und führen Sie sie in einer Schleife aus. Fügen Sie jedes Mal durch die Schleife die Ergebnisse hinzu, die es zu einem Array erhält. Jedes Mal, wenn der Abruf alle Ergebnisse erhält, überprüfen Sie, ob Sie die Anforderung abbrechen möchten.

    
deanWombourne 09.01.2011 11:25
quelle
1

Ich hatte das gleiche Problem wie du. Um es zu lösen, verwende ich eine performSelector:afterDelay: Methode

Es ist ein bisschen schwierig, aber wenn der Benutzer schnell 3 Buchstaben schnell tippt, möchte ich nicht 3 Anfragen senden, sondern nur eine, wenn der Benutzer die Eingabe beendet hat. Ich habe eine kleine Verzögerung von 0,5 oder mehr eingestellt.

Und benutze diesen Code:

%Vor%

Wenn der Benutzer schnell tippt, werden die vorherigen Anfragen storniert und nur die letzte gesendet.

    
kschaeffler 20.12.2013 01:41
quelle

Tags und Links