Как использовать агрегатную операцию «ALL» в NSPredicate для фильтрации коллекции на основе CoreData

Да, строковые литералы допустимы на все время программы, даже во время разрушения статических объектов.

2.13.4/1 в Стандарте говорит

, обычный строковый литерал имеет тип "массив n символа константы" и статическая продолжительность хранения.

в Стандарте говорится относительно 'статической продолжительности хранения' в 3.7.1/1:

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

16
задан jklp 16 October 2011 в 01:58
поделиться

1 ответ

Вы не можете делать то, что хотите с предикатом.

Операторы ANY и ALL применяются к тестируемому объекту (в данном случае Entry), а не к содержимому коллекции (selectedTags). Любой оператор вернет объект Entry, который соответствует любому отдельному элементу коллекции. Оператор ANY вернет первое найденное совпадение, а оператор ALL вернет все совпадения. Ни в том, ни в другом случае они не вернут запись, которая соответствует каждому элементу в предоставленной коллекции.

(Похоже, что вы пытаетесь использовать фактические Tag объекты в selectedTags. Скорее всего, это тоже не сработает, потому что сравнение объектов в классах без специальных методов сравнения обычно дает сбой. Это также медленно. сравнивайте атрибуты в предикатах.)

Поскольку у вас уже есть нужные объекты Tag, чтобы найти связанные с кандидатом объекты Entity, вам просто нужно пройти отношение Tag.taggedEntries. Затем вы должны найти пересечение всех наборов объекта Entity, чтобы найти только те Entity объекты, которые связаны с каждый выбранный Tag объект. Поскольку нет оператора пересечения коллекций, вам нужен цикл.

if ([selectedEntries count]>=2) {
    NSMutableSet *intersectEntries=[[NSMutableSet alloc] initWithCapacity:1];
    for (int i=1; i<[selectedTags count]; i++) {
        if ([intersectEntries count]==0) {            
            [intersectEntries unionSet:[[selectedEntries objectAtIndex:(i-1)] valueForKey:@"taggedEntries"]];
        }        
        [intersectEntries intersectSet:[[selectedEntries objectAtIndex:i] valueForKey:@"taggedEntries"]];
    }
}

(Примечание: я не проверял это, но оно должно работать.)

Теперь intersectEntries должен содержать только те Entry объекты, которые связаны с каждым выбранным тегом.

4
ответ дан 30 November 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: