2016-10-28 21 views
6

chcę pokazać dane, ponieważ pochodził z backend Warto więc mieć przykładowy plik json:NSOrderedSet odpowiedź od serwera i danych Core

{ 
    "fonts": [ 
    { 
     "name": "Helvetica", 
     "styleIdentifier": "H0", 
     "size": 17 
    }, 
    { 
     "name": "Helvetica", 
     "styleIdentifier": "H1", 
     "size": 14 
    }, 
    { 
     "name": "Helvetica-Bold", 
     "styleIdentifier": "H0Bold", 
     "size": 17 
    }, 
    { 
     "name": "HelveticaNeue-Light", 
     "styleIdentifier": "H0Light", 
     "size": 40 
    } 
    ] 
} 

Więc tworzę relationship (wiele - wiele) z ordered wybranej opcji . A przy wejściu widzę to zawsze pisać w taki sam sposób do danych Core, ale gdy próbuję pobrać go

configuratation.fonts gdzie fonts jest NSOrderedSet ja dostać elementy w kolejności zupełnie przypadkowej kolejności. Tęsknię za tym w specyfikacji? A może powinienem to jakoś posortować?

__EDIT__

Po pierwsze kiedy ja dostać danych z wyżej json Mam konfiguracji zestaw z pustym stosunku czcionki. Następnie pobieram to i wstawiam do podstawowych danych za pomocą:

NSMutableArray *returnArray = [NSMutableArray new]; 
for(NSDictionary *fontDictionary in jsonArray) { 
    Font *fontObj = [Font font:fontDictionary inContext:context]; 
    [returnArray addObject:fontObj]; 
} 

W tej tablicy dane są w prawidłowej kolejności. Następnie w obiekcie konfiguracyjnym i dodać go do NSOrderedSet przez:

-(void)appendTracks:(NSArray<Font*>*)fontArray { 
    self.fonts = [NSOrderedSet orderedSetWithArray: fontArray]; 
} 

a potem spróbować sprowadzić go po prostu używać odniesienia:

configuration.fonts 

I w tym punkcie dane nie są całkowicie w odpowiedniej kolejności.

+0

Edytuj pytanie, aby pokazać, jak pobierasz dane, gdy otrzymasz je w niewłaściwej kolejności. –

+0

Dodałem oba - dane wejściowe i wyjściowe – Kuba

+0

Nie dostaję go wtedy - jeśli potrzebuję dodatkowego atrybutu jaka jest różnica w podstawowych danych między NSSet i NSOrderedSet? – Kuba

Odpowiedz

2

Nie należy bezpośrednio konfigurować zestawu NSOrderedSet.

Albo modyfikować istniejący zestaw:

[self.fonts addObjectsFromArray:fontArray]; 

czyli

Xcode generuje metody, aby dodać lub usunąć wpisy z zamówionych zestawów w wygenerowanym NSManagedObject klasie.

Zakładając masz Entity nazywa ManagedConfiguration który posiada uporządkowaną do wielu relacji zwanej fonts:

ManagedConfiguration *managedObjectConfigurationInstance = //create or fetch configuration in ManagedObjectContext 
NSOrderedSet<ManagedFont> *fonts = //created or fetched fonts in wanted order 
managedObjectConfigurationInstance.addToFonts(fonts) 

replaceFonts, removeFromFontsAtIndex Aso. generowane są również metody.


W zależności od potrzeb, może chcesz zapisać czcionki w losowej kolejności i zastosować NSSortDescriptor do NSFetchRequest do pobrania danych w określonej kolejności.

1

Zamiast próbować ustawić dane bezpośrednio do nieruchomości (fonts), trzeba najpierw pobrać zmienny kopię NSOrderedSet z NSmanagedObject Podklasa (zakładam, że jest Font).

NSMutableOrderedSet *orderedSet = [self mutableOrderedSetValueForKey:@"fonts"]; 

Następnie dodaj obiekty z tablicy do tego zamówionego zestawu.

[orderedSet addObjectsFromArray:array]; 

Teraz należałoby poprawnie ustawić wartości dla klucza fonts. Tak więc Twoja funkcja appendTracks wyglądałaby teraz tak.

-(void)appendTracks:(NSArray<Font*>*)fontArray { 
    NSMutableOrderedSet *orderedSet = [self mutableOrderedSetValueForKey:@"fonts"]; 
    [orderedSet addObjectsFromArray:fontArray]; 
} 

Teraz wykonaj żądanie pobrania. Powinieneś otrzymać dane w ustalonej kolejności w tablicy.

PS: Użyłem twojej odpowiedzi JSON, aby przetestować to.

Powiązane problemy