Bezpośrednia odpowiedź na twoje pytanie brzmi: nie. Najlepszym wyjściem, z obecnym projektem, jest wykonanie ich w operacji, ale wtedy masz problem z gwintem i spowolnienie. Pamiętaj, że jeśli twoje operacje nie są uruchomione w głównym wątku, potrzebujesz osobnej NSManagedObjectContext
dla operacji lub będziesz mieć problemy z wątkami.
Lepsze pytanie: Dlaczego robisz nowe pobranie dla każdej postaci?
Jeśli masz już wyniki pobierania z poprzedniego wyszukiwania i użytkownik nie usunął znaku, po prostu weź istniejące wyniki i uruchom predykat na NSArray
. To jeszcze bardziej zawęzi wyszukiwanie, zamiast iść na dysk za każdym razem. Ponieważ jest w pamięci, będzie niezwykle szybki.
rozważyć następujące opcje podczas wdrażania pole wyszukiwania:
- Hit tylko dysk na pierwszym znaku
- Hit dysku tylko wtedy, gdy postać zostanie usunięta z pola wyszukiwania
- Rozważmy docisku objectID i właściwość searchable, aby uniknąć trafień na dysku.
W zależności od tego, czego szukasz (i są sposoby na renormalizację magazynu danych podstawowych w celu usprawnienia wyszukiwania), możesz wstępnie załadować trochę pamięci. Nawet przy rekordach 42K, jeśli właściwości wyszukiwania są wystarczająco małe, możesz je załadować do pamięci.
Prawdopodobnie należy przetestować tę przypadek użycia, jeśli użytkownik zaczyna od naciśnięcia "A".
Która część NSFetchRequest
jest wolna? Uderzanie w bazę danych SQLite lub ładowanie danych do pamięci? Na podstawie Twojej odpowiedzi możesz bezpośrednio poprawić skuteczność wyszukiwania.
Ta ostatnia nie działa, ponieważ w przypadku zlecenia sortowanego uzyskanie pierwszego 20 jako pierwszego n zajmuje prawie tyle samo czasu. – mclin