2016-04-05 6 views
0

Ich habe eine NSArray enthält JSON Zeichenfolge wie unten.Filterung JSON sticht Array mit NSPredicate und regulären Ausdruck

[ 
    { 
     "title":"find good book", 
     "isCompleted":true 
    }, 
    { 
     "title":"complete work", 
     "isCompleted":false 
    }, 
    { 
     "title":"check schedule", 
     "isCompleted":false 
    } 
] 

Ich möchte Indizes von Objekten mit "Plet" Wert unter "Titel" Schlüssel finden. Als ich einfach nur unter NSPredicate verwendete, gab es jedes Objekt zurück, weil jedes JSON Objekt mit "isCompleted" als Schlüssel sticht.

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"self CONTAINS[cd] %@", @"plet"]; 

Ich will nicht JSON-NSDictionary Objekt konvertieren. Und ich verwende [NSPredicate predicateWithBlock:] nicht, weil ich dieses Prädikat auf NSFetchedResultsController anwenden werde. Laut Dokument NSPredicate, die von [NSPredicate predicateWithBlock:] erstellt wird, kann NSFetchedResultsController nicht verwendet werden.

Also meine Frage ist, kann ich Regular Expression verwenden, um dieses Problem zu lösen? Ich weiß nicht viel über regulären Ausdruck. Kann jemand dafür ein Beispiel geben?

+0

Warum konvertieren Sie sie nicht in richtige Objekte und dann speichern Sie Objekte in die CoreData, danach können Sie Prädikat direkt mit der Eigenschaft verwenden? – ogres

Antwort

0

Sie können die PrädikatWithBlock-Methode zum Erstellen Ihres Prädikats verwenden. Überprüfen Sie im Block, ob die dynamische Variable den zu suchenden Wert enthält.

Code:

NSArray *yourArray = ....; 
NSString *searchText = ...; 

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary * _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) { 
    NSArray *dynamicVales = [evaluatedObject valueForKeyPath: @"dynamicVales.value"]; 
    return [dynamicVales containsObject:searchText]; 

}]; 

NSArray *filteredArray = [yourArray filteredArrayUsingPredicate:predicate]; 

von JhonyKutties Antwort kopiert. Viel Spaß beim Codieren :)