2017-07-18 4 views
1

Ich habe folgende shared.orderItems. Ich verwende sharedData.orderITems 's id wird verwendet, um shared.comboItem zu konstruieren. Ich frage mich, wie könnte ich sharedData.orderItems Daten filtern, wo es keine comboItemId gleich id gibt.Filterdaten basierend auf ID Objective-C

Zum Beispiel gibt es im folgenden Beispiel zwei Artikel id sind 71 und 72 werden in shared.ComboItems verwendet. Ich möchte 71 und 72 auf shared.orderItems filtern und nur die Objekt-ID 1 behalten.

(lldb) po sharedData.orderItems 
<__NSArrayM 0x174050860>(
{ 
    Note = ""; 
    Quantity = 1; 
    id = 72; 
}, 
{ 
    Note = ""; 
    Quantity = 1; 
    id = 71; 
}, 
{ 
    Note = ""; 
    Quantity = 2; 
    id = 1; 
} 
) 


(lldb) po sharedData.comboItems 
<__NSArrayM 0x174247620>(
{ 
    Note = ""; 
    Quantity = 1; 
    comboItemId = 72; 
    id = 3; 
}, 
{ 
    Note = ""; 
    Quantity = 1; 
    comboItemId = 71; 
    id = 19; 
}, 
{ 
    Note = ""; 
    Quantity = 1; 
    comboItemId = 72; 
    id = 20; 
}, 
{ 
    Note = ""; 
    Quantity = 1; 
    comboItemId = 72; 
    id = 21; 
} 
) 
+0

Sie sortDescriptors verwenden können –

+0

könnten Sie bitte erläutern? – hotspring

+0

Sie müssen sortieren oder filtern? –

Antwort

2

Haben Sie Prädikat versucht?

  1. Filter shared.comboItems, um alle comboItemId in ein Array zu bekommen.
  2. Verwenden Prädikat mit NOT IN filtern sharedData.orderItems

Lösung:

NSArray *unique = [shared.comboItems valueForKeyPath:@"@distinctUnionOfObjects.comboItemId"]; 
NSPredicate *nonePredicate = [NSPredicate predicateWithFormat: @"NOT(id IN %@)", unique]; 
NSArray *filtered = [sharedData.orderItems filteredArrayUsingPredicate:nonePredicate]; 
NSLog(@"Filtered: %@", filtered); 
4

Ich glaube, ich verstehe die Frage Sie bedeuten wollen orderItems auszuschließen, die in dem durch das comboItemId Attribut bezeichnet werden comboItems Array. Zuerst diejenigen sammeln:

NSMutableSet *excludedIds = [NSMutableSet set]; 
for (NSDictionary *item in sharedData.comboItems) { 
    [excludedIds addObject:item[@"comboItemId"]]; // EDIT 
} 

Arrays von Prädikaten gefiltert werden können, und diese können mit Formatstrings angegeben werden (see here). Sie müssen also:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (id IN %@)", excludedIds]; 
NSArray *filtered = [sharedData.orderItems filteredArrayUsingPredicate:predicate]; 
+0

Ich bekomme das folgende Problem 'Eigenschaft 'ComboItemId' nicht auf Objekt vom Typ 'NSDictionary *' 'gefunden Soll ich stattdessen '[excludedIds addObject: [item valueForKey: @" comboItemId "]]' 'verwenden? – hotspring

+0

@hotspring - das ist mein schlechtes. siehe Bearbeiten. – danh

+0

Jetzt bekomme ich den folgenden Fehler 'Beenden App aufgrund der nicht abgefangenen Ausnahme' 'NSInvalidArgumentException', Grund: 'Kann nicht die Formatzeichenfolge "ID NONE% @"' 'im Prädikat analysieren. – hotspring

2

Sie Key Value Coding verwenden können - Collection Operatorids von Combo Artikel zu erhalten.

@distinctUnionOfObjects: eine Anordnung der Objekte in der Eigenschaft in dem Schlüsselpfad rechts von dem

NSArray *compoIds = [sharedData.CompoItems valueForKeyPath:@"@distinctUnionOfObjects.comboItemId"]; 

NSPredicate *dupIdsPredicate = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) { 
    NSDictionary *orderItemDictionary = (NSDictionary *) obj; 
    return ![compoIds containsObject:[orderItemDictionary valueForKey:@"id"]]; 
}]; 

NSArray *unionOfIDs = [sharedData.orderItems filteredArrayUsingPredicate:dupIdsPredicate]; 

NSLog(@"%@", unionOfIDs); 

Operator angegeben Kosten