Может ли NSP предикат искать объект в массиве, принадлежащий объекту в другом массиве? - PullRequest
1 голос
/ 16 сентября 2009

Я прочитал документацию NSPredicate и не мог полностью обдумать это. Простые предикаты, которые я могу понять, но теперь, как мне создать предикат для следующей ситуации:

У меня есть массив объектов Foo. В классе Foo одним из iVars является NSMutableArray объектов Bar. Мне нужно отфильтровать массив объектов Foo, чтобы получить те, которые имеют определенный объект Bar в своем массиве. Как?

Кроме того, проще (или возможно) найти несколько объектов Bar одновременно или объединить несколько предикатов, которые каждый ищет для определенного бара?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2009

Я нашел то, что искал:

@class Foo {
  int var1;
  NSArray *barObjs;
}

predicate = @"var1 == 5 AND ANY barObjs.id == 5";
3 голосов
/ 16 сентября 2009

Ваш вопрос можно разделить на два вопроса, и я постараюсь ответить на них по порядку.

  1. Вы можете определить предикат для Foo экземпляров, который имеет значение true, только когда массив экземпляра объектов Bar содержит экземпляр Bar, соответствующий отдельному предикату. То, что вы хотите, это выражение [SUBQUERY][1]. Строка предиката, подобная этой, будет соответствовать Foo экземплярам со значением fooInt 10 и экземпляру Bar в свойстве barArray, значение barInt которого равно 1:

    @ "fooInt == 10 && SUBQUERY (barArray, $ x, $ x.barInt == 1). @ Count> 0"

    Общий формат выражения SUBQUERY: SUBQUERY(collection, $var, predicate). Выражение SUBQUERY возвращает набор объектов в collection, которые соответствуют predicate, поэтому, взяв его @count, вы узнаете, есть ли у экземпляра Foo экземпляр Bar, который соответствует предикату подзапроса.

  2. Вы можете иметь произвольно сложный предикат в выражении SUBQUERY (включая вложенные выражения SUBQUERY). Учитывая, что предикаты, содержащие выражения SUBQUERY, как правило, дороги для выполнения (они примерно соответствуют SQL JOIN), вероятно, лучше искать несколько Bar экземпляров в одном SUBQUERY выражении, используя OR, а затем проверять на соответствие @count в результате SUBQUERY. Строка предиката, такая как

    @ "fooInt == 10 && SUBQUERY (barArray, $ x, $ x.barInt == 1 || $ x.barInt == 2). @ Count> = 2"

    найдет Foo экземпляров, которые имеют Bar экземпляр с barInt == 1 и Bar экземпляр с barInt == 2 в Foo экземпляре barArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...