Быстрое объяснение SUBQUERY в выражении NSPredicate - PullRequest
26 голосов
/ 28 сентября 2010

Похоже, что нулевая документация по ключевому слову SUBQUERY от Apple, и я не могу найти простое объяснение по этому поводу в SO или в Google. Это заговор! ;)

Пожалуйста, , может ли кто-нибудь из внутреннего круга просто дать краткое объяснение его синтаксиса, чтобы я мог его использовать?

SUBQUERY(Bs, $x, $x IN %@)

Спасибо

Ответы [ 3 ]

41 голосов
/ 28 сентября 2010

А для людей, которые не совсем понимают, о чем говорит документация, SUBQUERY по сути это:

SUBQUERY(collection, variableName, predicateFormat)

И может быть (упрощенно) реализовано так:

id resultingCollection = ...; //a new collection, either a mutable set or array
NSMutableDictionary * substitutions = [NSMutableDictionary dictionary];
NSPredicate * p = [NSPredicate predicateWithFormat:predicateFormat];
for (id variable in collection) {
  [substitutions setObject:variable forKey:variableName];
  NSPredicate * filter = [p predicateWithSubstitutionVariables:substitutions];
  if ([filter evaluateWithObject:collection] == YES) {
    [resultingCollection addObject:variable];
  }
}
return resultingCollection;

Итак, в двух словах, SUBQUERY в основном берет коллекцию объектов и отфильтровывает различные объекты на основе выражения предиката SUBQUERY, и возвращает полученную коллекцию. (И сам предикат может содержать другие SUBQUERY s)

Пример:

NSArray * arrayOfArrays = [NSArray arrayWithObjects:
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           [NSArray arrayWithObjects:....],
                           nil];
NSPredicate * filter = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, $a.@count > 42)"];
NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter];
//"filtered" is an array of arrays
//the only arrays in "filtered" will have at least 42 elements each
21 голосов
/ 28 сентября 2010

Это то, что оценивает подзапрос. (Найден из этой цепочки рассылки , хит # 1 для "подзапроса NSPredicate" в Google.) Этот фрагмент документации также объясняет как к нему относится синтаксис строки формата предиката.

0 голосов
/ 15 декабря 2016

Подзапрос представляет предикат (третий аргумент - $x IN %@), который оценивается для всех объектов (второй аргумент - $x - это похоже на имя переменной в foreach) отношения (первый аргумент - Bs). Аналогично обычному запросу возвращает список объектов.

Я вижу во многих местах, что люди $x используют почти догматично, но $object в objects отношениях также имеет смысл (или $city в cities ...):)

...