2009-09-29 15 views
9

Jakie są dobre praktyki asynchronicznego pobierania dużych ilości kodu XML z usługi RESTful do magazynu danych podstawowych, a także z tego sklepu, zapełniając w locie UITableView?Dobre strategie dla REST -> XML -> Podstawowe dane -> UITableView?

mam na myśli używając xmlParseChunk() funkcję libxml2 do analizowania kawałki XML przychodzącej i tłumaczyć węzła i jego dzieci do odpowiednich obiektów zarządzanych, jak węzły wejść.

Jednocześnie te węzły XML przekształcone w zarządzane obiekty, po kolei generuję wiersze UITableView. Powiedz, 50 wierszy naraz. Czy to jest realistyczne?

Co robisz, aby wykonać to zadanie, aby utrzymać wydajność i obsłużyć potencjalnie tysiące wierszy? Czy istnieją inne, prostsze podejścia, które działają równie dobrze lub lepiej?

+1

Możesz znaleźć http://cocoawithlove.com/2009/09/optimizing-loading-of-very-large-table.html przydatne. –

Odpowiedz

14

Oczywiście, to dość standardowa rzecz. Najłatwiejszym rozwiązaniem jest załadowanie w wątku tła na jednym MOC i uruchomienie interfejsu na głównym wątku z własnym MOC. Gdy pojawi się porcja danych, które chcesz mieć (powiedzmy 50 wpisów), masz tło MOC save:.

Zakładając, że masz pierwszy plan MOC uzbrojony do scalenia zmian (przez mergeChangesFromContextDidSaveNotification:), to za każdym razem, gdy zapiszesz MOC tła, MOC na pierwszym planie otrzyma wszystkie te zmiany. Zakładając, że korzystasz z NSFetchedResultsController, masz metody delegowania, aby poradzić sobie ze zmianami w jego MOC, i jeśli używasz przykładowego kodu Apple, prawdopodobnie masz już wszystko poprawnie skonfigurowane.

Ogólnie CoreData będzie szybszy niż cokolwiek, co się toczy, chyba że naprawdę wiesz, co robisz i jesteś gotów poświęcić mnóstwo czasu na dostosowanie się do konkretnego przypadku.Największą rzeczą, jaką możesz zrobić, to upewnić się, że powolne rzeczy (takie jak przetwarzanie XML i synchroniczne operacje we/wy flashami spowodowane przez save:) nie dotyczą głównej interakcji użytkownika blokującej wątki.

+0

+1, ale chciałbym wykopać http://sqlitepp.berlios.de/ przeciwko CoreData w meczu śmierci bez blokady, aby zobaczyć, który jest szybszy – slf

+3

Absolutnie mogę (i mam) pobić CD na określonych obciążeniach bezpośrednio za pomocą SQLite3. Ale zwykle ilość wysiłku była nieprzyzwoita. Skończyłbym z lepszą aplikacją przy użyciu CoreData, a następnie zajmując 1/3 czasu, który zapisałam strojenie innych elementów mojej aplikacji. Nie piszemy kodu w próżni. Nauczyłem się na własnej skórze, że często lepiej jest zrezygnować z absolutnej teoretycznej wydajności i zaoszczędzić czas, aby wprowadzić (większe) praktyczne ulepszenia wydajności do innych elementów kodu aplikacji. Oczywiście, dokładne szczegóły zmieniają projekt do projektu. –

+0

Czy jest jakiś przykładowy kod, który demonstruje użycie wielu MOCs ze zmianami połączonymi z jednym głównym MOC? –

2

Joe Hewitt (twórca aplikacji na Facebooka) opublikował znaczną część swojego kodu jako open-source. Nazywa się Three20. Jest tam klasa, która świetnie nadaje się do pobierania danych internetowych i umieszczania ich w tabeli, bez konieczności wcześniejszych danych. Klasy używane do tego są nazywane TTTableViewController i TTTableViewDataSource.

Z tego miejsca nie byłoby zbyt wiele czasu na przechowywanie jako CoreData, wystarczy podklasować klasy, jak uważasz za zgodne z dostarczonymi hakami.

Jeśli obawiasz się zbyt dużej ilości danych, 50 na raz brzmi rozsądnie. Te klasy mają wbudowany przycisk "Więcej", aby Ci pomóc.

Od readme Three20:

internetowe świadomy widok tabeli kontrolery
TTTableViewController i TTTableViewDataSource pomóc budowania tabel, które ładują ich treść z Internetu. Zamiast po prostu zakładając, że masz wszystkie dane gotowe iść, jak UITableView robi przez domyślnie TTTableViewController pozwala komunikować gdy dane są ładowania, a gdy wystąpi błąd lub nic do wyświetlenia. Pomaga również użytkownikowi dodać przycisk "Więcej", aby załadować następną stronę danych na , a opcjonalnie obsługuje ponowne ładowanie danych przez potrząsanie urządzeniem .

+0

Chyba nie jestem jasny. Właściwie chcę zapełnić magazyn Core Data, który z kolei zapełnia widok tabeli. Nie jest jasne, czy ta podklasa rozwiązuje ten konkretny problem, jeśli ściąga komórkę danych przez komórkę (co nie jest tym, czego potrzebuję do wykonania). –

0

Nikt już nie wspomniał o RestKit? Moi przyjaciele ... poważnie, musisz to sprawdzić. Jeśli robisz coś z REST na iOS (a teraz na OS X), a szczególnie jeśli chcesz pracować z Core Data ... PROSZĘ spójrz na RestKit. Oszczędziłem niezliczoną ilość godzin, wykonując dość skomplikowaną synchronizację danych między serwerem a modelami Core Data na iOS. RestKit sprawił, że było to tak cholernie łatwe, że prawie sprawia, że ​​jesteś chory.

+0

RestKit wydaje się borykać z XML - analizator składni XML, który jest dostarczany, ma błędy ARC po kompilacji na iOS 5. Ogólnie jednak wygląda świetnie - szczególnie dla prostego JSON. – radven

Powiązane problemy