2009-08-12 10 views
6

Zajmuję się tworzeniem aplikacji na iPhone'a, która intensywnie korzysta z danych podstawowych, przede wszystkim ze względu na funkcje podobne do bazy danych (takie jak możliwość ustawiania porządku sortowania lub predykatu na żądanie pobierania). Przedstawiam wszystkie dane, które pobieram w różnych kontrolerach UITableViewController.Dotyk Cocoa: Kiedy NSFetchedResultsController staje się niezbędny do zarządzania pobieraniem danych podstawowych?

To, co chciałbym wiedzieć, to przybliżony pomysł na liczbę obiektów, które mogę pobrać, zanim dobrze będzie użyć NSFetchedResultsController do obsługi żądania. W dokumentach Core Data pisze, że sklepy SQLite uważają "10 000 obiektów za dość mały zestaw danych", ale w dokumentacji NSFetchedResultsController wspomina o przechowywaniu "dziesiątek obiektów" w pamięci naraz.

Mam do czynienia głównie z zestawami danych do pięćdziesięciu obiektów, z których każdy może mieć tuzin przykładów NSNumber i NSString, a także relacji jeden do wielu dla następnego zestawu obiektów (np. instancje obiektu A, z których każdy ma stosunek do wielu do zbioru trzydziestu (różnych) wystąpień obiektu B, z których każdy ...).

Czy ten scenariusz dobrze pasuje do korzystania z NSFetchedResultsController, czy mogę uciec z prostym NSArray wyników? Nie mam problemu z zarządzaniem nicetami kontrolera (wygodne metody uzyskiwania obiektu dla ścieżki indeksu UITableView, dodawania nowych obiektów z powrotem do kontekstu itp.), Zastanawiam się tylko nad wykorzystaniem pamięci każde podejście.

Powinienem wspomnieć, że aplikacja będzie kierowana głównie do użytkowników iPhona 3G (nie S) i pierwszej generacji iPodów Touch, dlatego należy pamiętać o ograniczonej pamięci tych platform.

Odpowiedz

11

NSFetchedResultsController to niezwykle przydatna klasa pomocnicza do łączenia danych rdzenia z Twoimi widokami UITableView. Moje zalecenie byłoby używać go z każdym widokiem tabeli, który ma podkład danych podstawowych. W każdym przypadku, w którym go użyłem, znacznie zmniejszyło to ilość kodu, który musiałem napisać.

Z punktu widzenia wydajności, może to również doprowadzić do znacznej poprawy. Zamiast pobierać cały zestaw danych, jeśli użyjesz opcji -setFetchBatchSize: z parametrem NSFetchRequest, który podajesz do NSFetchedResultsController, możesz wykonać pobieranie grupowe, w którym są pobierane tylko odpowiednie dane wyświetlane w widoku tabeli. Dane, które nie są już wyświetlane, mogą również zostać automatycznie usunięte z pamięci (podobnie jak moje zrozumienie).

W przypadku tabel z umiarkowanymi i dużymi zbiorami danych może to doprowadzić do znacznego zwiększenia wydajności. Inżynierowie Apple twierdzili, że w przypadku bazy danych o 10 000 pozycji może to skrócić czas uruchamiania o ponad 80%, a wykorzystanie pamięci o 50%.

+1

Po drugie i nie mogę go wystarczająco polecić. Jestem w trakcie ponownego pisania mojej aplikacji z CoreData, i widziałem ogromne zyski za pomocą FetchedResultsController. – jbrennan

+0

Z wyjątkiem tego, że osobiście miałem problemy z ładowaniem zestawów danych za pomocą fetchResultsController i nie będę już na nie odpowiadać. Wygląda na to, że nie pobiera prawidłowo pobranych obiektów ObjectObjects, gdy przegląda je i wydaje się, że piekło skupia się na trzymaniu wszystkiego podczas ładowania. – TheCodingArt

Powiązane problemy