NSSet в NSPredicate, работает, только если сначала я выдаю nsset.count

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

У меня есть объект A, связанный с другим объектом B, и некоторые строки A имеют специальную отметку в одном поле.

Я хочу посчитать, сколько из тех, которые имеют отношение к B, имеют эту особую отметку.

Все работает отлично, если после создания NSSet я считаю набор:

NSSet *productsSet = currentList.ingredients;

int countProducts = productsSet.count;

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"self IN %@ AND isInList = %d", productsSet,1];

[fetchRequest setPredicate:predicate];

int totalProductsInList = [context countForFetchRequest:fetchRequest error:error];

Если я прокомментирую int countProducts = productsSet.count; У меня есть эти ошибки:

-[NSNull unsignedIntValue]: unrecognized selector sent to instance 0x22b9cd8
2011-12-05 12:10:41.418 xxxxxxxxxx[32964:1bb03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NSNull unsignedIntValue]: unrecognized selector sent to instance 0x22b9cd8'

isInList является Int16

Спасибо,

РЕДАКТИРОВАТЬ:

Если я перемещаю 1 внутри NSP-предиката без подсчета, я получаю ту же ошибку:

[NSPredicate predicateWithFormat: @"self IN %@ AND isInList = 1", productsSet;

РЕДАКТИРОВАТЬ 2:

Поскольку я не могу найти, почему это не работает, я проверяю productsSet.count, и если он больше 0, я делаю NSFetchrequest, проблема решена.

2 ответа

Решение

Что ж, после создания NSSet я проверяю nsset.count, и в случае, если он больше нуля, я выдаю NSFetchrequest, а если он нулевой, не делайте.

Проблема решена, но у меня все еще есть любопытство к этой странной ошибке, которая возникает, если я не использую nsset.count.

Спасибо,

Объект NSSet, возвращаемый отношением, является не обычным NSSet, а объектом класса _NSFaultingMutableSet. И кажется, что это небезопасно использовать в NSPredicate. Может быть, это превращается в состояние неисправности или что-то. Причина проблемы выглядит так же, как в Core Data/NSOperation: сбой при перечислении и удалении объектов.

Поэтому лучше всего использовать результат allObjects или создать новый объект NSSet:

NSArray *productsArray = [currentList.ingredients allObjects];

или же

NSSet *productsSet = [NSSet setWithSet:currentList.ingredients];

Другие вопросы по тегам