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];