NSSet в NSPredicate, работает, только если сначала я выдаю nsset.count - PullRequest
0 голосов
/ 05 декабря 2011

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

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

Я хочу посчитать, сколько из тех 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 ]

0 голосов
/ 05 сентября 2014

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

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

NSArray *productsArray = [currentList.ingredients allObjects];

или

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

0 голосов
/ 12 декабря 2011

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

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

спасибо,

...