2015-06-05 2 views
0

Я пытаюсь отфильтровать массив пользовательских объектов на основе свойства этих объектов name.NSArray filterArrayUsingPredicate никогда не возвращающее/блокирующее выполнение

Чтобы убедиться, что все работает, я просто использовал это, которое должно совпадать с точно 1 элемент в массиве:

NSLog(@"Length before %lu", (unsigned long) [self.mutableAvailableSources count]); 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name == CNN)"]; 
[self.mutableAvailableSources filterUsingPredicate:predicate]; 

NSLog(@"Length after %lu", (unsigned long) [self.mutableAvailableSources count]); 

Это должно войти

Length before 9 
Length after 1 

Однако, он записывает только

Length before 9 

И затем он прекращает выполнение. Ничто не проходит после фильтрации строки. Я попытался поставить точку останова на второй NSLog(..);, но он так и не дошел. Если я помещаю точку останова в строку, фильтрующую массив, она останавливается, и я могу подтвердить, что существуют как массив, так и предикат.

Что здесь происходит?

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

+0

Возможно ли, что содержащий объект будет уничтожен до завершения блока? – Paulw11

+0

Нет, это общий объект (экземпляр singleton), поэтому он не должен быть освобожден (/ уничтожен). Если я удалю строку, которая фильтрует массив, все остальное отлично работает - оно продолжает выполняться до конца блока. Итак, есть что-то о линии, которая фильтрует массив. – Aleksander

+0

У вас есть опечатка в вашем вопросе? Если это 'filterUsingPredicate', а не' filterArrayUsingPredicate', если вы не можете показать источник для 'filterArrayUsingPredicate'. Примечание. 'NSMutableArray' не является потокобезопасным, поэтому вы не должны манипулировать им в нескольких потоках, по крайней мере,' @ synchronized' – Paulw11

ответ

1

Изменить это:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'CNN'"]; 

В предикатах, вы должны использовать языки запросов, в этом случае является строковым: в языках запросов два варианта: «stringLitareal» или «СтроковогоЛитерала», но это второй don' t, потому что «используется в объективе-C, вам нужно scape the», вот что: name == \ «CNN \». Вы можете проверить это, то же самое:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == \"CNN\""]; 

Дополнительная информация: https://developers.google.com/chart/interactive/docs/querylanguage#literals

Скобки не является проблемой (Query Language). Это также работает: @ "(name == 'CNN')"

+0

Ничего себе я не могу поверить, что это сработало ... Спасибо! Поэтому я предполагаю, что он просто не закончил выполнение с круглыми скобками. Не могли бы вы объяснить, почему это не сработает? – Aleksander

+0

Я думаю, что лучшее изменение было бы следующим: '[NSPredicate predicateWithFormat: @" name ==% @ ", @" CNN "];' – rmaddy

+0

Больше объяснений. –

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