2015-01-30 2 views
-1

Обычно при попытке создать NSPredicate вы должны использовать NSString, NSNumber или NSDate. Я пытаюсь создать NSPredicate из неуказанного класса.NSPredicate with Custom NSObject

Это, как я создаю предикат:

[NSPredicate predicateWithFormat:@"property == %@", value]; 

Если значение является NSString, это работает отлично, но если я создаю MyIdObject и я установить значение, чтобы быть MyIdObject я получаю немного разные предикаты

это является результатом ро предикатов я получаю:

С NSString: свойством == "123"

С MyIdObject: недвижимость == 123

Поскольку идентификатор сохраняются как NSString в CoreData, этого достаточно, чтобы сделать предикат неудачу.

Я знаю, что 123 возвращается из метода описания.

Просто добавив необходимое "в формате предиката не является решением, потому что тогда я буду просто получить свойство ==„% @“

По какой-то причине, когда NSString возвращается из MyIdObject оно трактуется по-разному от просто имея NSString есть ли какое-либо решение для этого

Попытки упростить вопрос:.? Я хочу создать предикат, используя любой NSObject в качестве значения и не NSString, хотя значение сохраняются как NSString в CoreData. Возможно ли это?

+0

Я хочу вам помочь, но после 10 чтений я не могу сделать голову или хвост того, что вы пытаетесь спросить. Не могли бы вы проверить/переписать? – GuybrushThreepwood

+0

Спасибо за ответ. Я добавил абзац в конце. Надеюсь, это улучшит вопрос. –

+0

Можете ли вы объяснить, что вы подразумеваете под этими двумя утверждениями: «Идентификатор сохраняется как NSString в CoreData» и «NSString возвращается из MyIdObject»? Если вы сохраняете некоторую форму идентификатора в MyIdObject, тогда ваш предикат должен использовать тот же идентификатор - он не может просто попытаться использовать сам MyIdObject. – pbasdf

ответ

1

Ваш объект не является классом NSString и поэтому не экранирован как строка.

Вы должны использовать метод description явно или предоставить предикат с строкой, отформатированной самостоятельно.

DSIdentifier* dataSource = [DSIdentifier new]; 
dataSource.identifier = @"identifier"; 
// the first method 
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"property = %@", dataSource.description]; 
// the second method 
NSPredicate* otherPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"property = \"%@\"", dataSource]]; 

NSLog(@"predicate: %@, other predicate: %@", predicate, otherPredicate); 
// predicate: property == "identifier", other predicate: property == "identifier" 
+0

Спасибо Turekj. Я бы предпочел не ссылаться на описание напрямую, потому что хотел сохранить этот код как можно более общим, и это вызовет проблемы с NSDates. Подобная ситуация просто выйдет из строя. Я попытался изменить метод описания своего класса, чтобы избежать правильной строки, и хотя я получил то, что казалось правильным предикатом (listReference == "1"), выборка все еще не удалась. –