2014-10-09 5 views
1

У меня есть словари, как этогоПоиск по массиву массива словарей по ключевому

NSDictionary *dictA = @{ @"name" : @"John", 
          @"city" : @"Los Angeles" }; 

    NSDictionary *dictB = @{ @"name" : @"Bob", 
          @"city" : @"Los Angeles" }; 

    NSDictionary *dictC = @{ @"name" : @"Carl", 
          @"city" : @"Dallas" }; 

Десятки словарей, как это было отделенных города и положить в других словарях как

NSArray *losAngeles = @[ dictA, dictB, ....]; 

    NSArray *dallas = @[ dictC, ... ]; 

и все находится внутри массива

self.arrayAll = @[losAngeles, dallas, miami... ]; 

сейчас лучше, я хочу получить словарь, который содержит человека по имени Боб (предположим, что все имена уникальны).

Если это массив dicts Я хотел бы сделать это

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"]; 
    NSarray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred]; 

Но поскольку arrayAll представляет собой массив из массива dicts, это не работает со следующей ошибкой:

*** нагрузочных app из-за неперехваченного исключения «NSInvalidArgumentException», причина: «Невозможно выполнить операцию подстроки с чем-то, что не является строкой ????

любые подсказки?

ответ

1

я сделаю это что-то вроде этого ...

NSMutableArray *results = [NSMutableArray array]; 

[citiesArray enumerateObjectsUsingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) { 
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(name BEGINSWITH[cd] %@)", @"Bob"]; 
    NSArray *filteredNames = [self.arrayAll filteredArrayUsingPredicate:pred]; 

    [results addObjectsFromArray:filteredNames]; 
}]; 

Вы могли бы добавить опцию параллелизм, как это ...

[citiesArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSArray *dictArray, NSUInteger idx, BOOL *stop) { 
    //stuff... 
}]; 

Чтобы он запускается одновременно. Я не знаю, как бы обработать массив результатов. Попробуйте.

Это будет использовать быстрое перечисление и параллелизм для всех шагов.

+1

Я думаю, что это лучший вариант. БЛАГОДАРЯ!!!!!!!! – SpaceDog

+0

Не беспокойтесь, рад помочь. – Fogmeister

1

Почему вы не делаете быстрое перечисление? Что-то вроде:

for (NSArray *cityArray in self.arrayAll) { 

    for (NSDictionary *cityDictionary in cityArray) { 

    if ([[cityDictionary valueForKey:@"name"] isEqualToString:@"Bob"]) { 
     //do something 
    } 

    } 

} 
+0

Я тоже думал об этом, но разве это не слишком тяжело для устройства? –

+0

№ Этот вид перечисления происходит все время в разных рамках, но одновременно. Я предлагаю вам сделать это в другом потоке, и если вам нужно обновить интерфейс, просто вызовите основной поток. – Razvan

Смежные вопросы