2012-01-05 8 views
8

Piszę metodę API, która zwraca listę obiektów z usługi internetowej. Ta usługa buforuje także wyniki i próbuje zwrócić wyniki z pamięci podręcznej (jeśli istnieją) przed ponownym uruchomieniem usługi WWW. Więc przechowuję tę listę w jednostce Core Data. Ale Core Data zezwala tylko na przechowywanie relacji "to-may" w NSSet, który nie zachowuje porządku. Ale chcę, aby wyniki z pamięci podręcznej zachowały oryginalne zamówienie (które pochodziło z usługi sieciowej). Niekoniecznie wiem, jak ustalono ten porządek (więc nie mogę go sortować).Jak mogę zachować uporządkowaną listę w Core Data

Jak mogę zachować to zamówienie? Mój plan jest do przechowywania ciąg z identyfikatorami obiektów, które można później wykorzystać do ich kolejności:

NSString *objectIds = @"1 5 2 9 4"; 

Jest to najlepszy sposób to zrobić?

Odpowiedz

10

Jeśli możesz kierować reklamy na system iOS 5, możesz użyć nowej funkcji NSOrderedSet dla dowolnie uporządkowanych relacji danych podstawowych. Zobacz Core Data Release Notes for iOS 5, aby uzyskać więcej informacji na temat tej nowej funkcji.

Jeśli musisz obsługiwać iOS 4, musisz samemu zająć się zamówieniem. Najczęstszym sposobem na to jest dodanie do twojego modelu właściwości integer, którą następnie musisz zarządzać samodzielnie. Następnie możesz sortować tę właściwość podczas pobierania danych.

Przechowywanie zamówienia w zupełnie innym ciągu wydaje się być niewłaściwym sposobem. Jeśli kolejność jest ważna, informacja ta powinna znajdować się w modelu, a użytkownik powinien mieć możliwość bezpośredniego zapytania o nią ("podaj mi pięć pierwszych obiektów z tej konkretnej listy" lub "jaki jest indeks obiektu foo"). Konieczność pobrania ciągu identyfikatorów obiektów, ich analizowania, a następnie zapytania o identyfikatory niektórych obiektów jest dla mnie bardzo niesłuszna.

+1

Uważam, że jest to przydatne tylko w przypadku wielu relacji. – 3lvis

+0

@SebastianCelis to świetna odpowiedź, była bardzo pomocna dla kogoś takiego jak ja, który uczy się iOS Dev po raz pierwszy :) Dziękuję. – GangstaGraham

+0

Jak powiedział inny komentator, NSOrderedSet jest dostępny tylko dla wielu relacji. Ponadto informacje o wydaniu systemu iOS 5 nie są już dostępne. – Ixx

1

To subiektywne pytanie. Możesz także ustawić je jako listę połączoną w takiej kolejności, w jakiej chcesz.

1

Dołącz własne pole identyfikatora NSNumber w modelu CoreData, w którym przechowujesz obiekty. Identyfikator będzie reprezentował porządek, który chcesz zachować; musisz oczywiście ustawić to sam. Następnie, gdy pobierasz obiekty z CoreData, możesz to zrobić posortowane według tego identyfikatora. Możesz chcieć/musisz utrzymywać gdzieś najwyższą wartość identyfikacyjną przypisaną do prawidłowego zamawiania z kolejnymi wywołaniami usług sieciowych i uruchomieniami aplikacji.

+0

To zadziała, ale wydaje się bardziej narzutem niż zwykłym ciągiem znaków, choć nie jestem pewien, jak dobrze Core Data radzi sobie z pewnymi dużymi ciągami znaków. – caleb

+0

Podczas gdy identyfikator obiektu jest wartością, w którą wierzę, że możesz polegać na tym, że nie zmieniasz się za plecami, myślę, że użycie własnego pola id, którego wartość jest ustalona na podstawie monotonnie rosnącego indeksu głównego, który utrzymujesz w innym miejscu, z pewnością będzie bardziej czyste. Zupełnie jednak pojmuję pojęcie równoważenia złożoności z wygodą. Jeśli już kopiujesz elementy danych każdego obiektu (z usługi WWW) do elementów danych odpowiednich obiektów CoreData, dodanie jeszcze jednego pola dla identyfikatora nie będzie stanowić o wiele więcej kodu. –

+0

Core Data nie obsługuje 'NSOrderedSet', gdy jest używane w połączeniu z mogeneratorem, więc ta opcja, choć droższa (test i nauka), będzie działać lepiej. – fatuhoku

Powiązane problemy