2015-06-30 1 views
1

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

Как таковой, я решил использовать свои собственные UniqeID, как рекомендовано в документах и ​​других. Я видел много примеров здесь в Stack Overflow и в других местах, где простое хранение значения NSUUID в основном поле данных.

Однако этого недостаточно для того, что я хочу. Одна из полезных вещей о NSManagedObjectID заключается в том, что он всегда является одним и тем же объектом и может быть сопоставлен указателем, поэтому вы можете публиковать уведомления об использовании NSManagedObjectID в качестве своего объекта, все, что требует информации о сущности, может регистрироваться для уведомления на основе NSManagedObjectID без написания дополнительного кода, чтобы проверить, действительно ли уведомление является тем, которое мы ищем.

Однако, было бы все равно быть истинным, если NSString передается вместо NSManagedObjectID? Мы всегда должны использовать isEqualTo для сравнения NSString, даже если это может быть один и тот же объект. Я чувствую, что использование NSString в качестве объекта для уведомления - это немного нет.

В моем случае это почти гарантированно будет одним и тем же объектом, если только объективные c беспорядки с NSString за кулисами. уникальный идентификатор генерируется один раз при вставке объекта и будет передаваться без изменений по мере необходимости, и я просто хочу заменить все вызовы, где я использую NSManagedObjectID, с чем-то, что я могу добавить с минимальными изменениями.

CFUUID может показаться идеальным, поскольку они могут быть гарантированы для обмена значениями указателей, однако CFUuidRef не является объектом-c, поэтому он не может использоваться для уведомлений между прочим. NSUUID, кажется, лучше всего отличается от оговорки в документации, в которой говорится, что они не гарантируются одним и тем же объектом. Но если мой NSUUID создается, сохраняется и извлекается на одном объекте, можем ли мы гарантировать, что переданный вокруг NSUUID один и тот же объект во всем приложении? Если да, не могли бы мы сказать то же самое о NSString? Даже если бы мы могли, я был бы счастливее, только что с NSUUID.

Я не могу передать объект непосредственно, поскольку я использую уведомление для публикации информации между отдельными потоками. Несмотря на то, что я только когда-либо изменяю объекты в основном потоке, и сущности могут быть доступны для чтения только по потокам, у меня было много проблем в прошлом, все прошло, как только я реализовал систему на основе использования только NSManagedObjectID.

ответ

0

Возможно, я ошибался, но почему бы не обойти экземпляры NSUUID (если вы не хотите использовать экземпляры NSString) и сравниваете их с равенством?

@interface NSUUID(Equality) 
- (BOOL)isEqualToUUID:(NSUUID*)other; 
@end 

@implementation NSUUID(Equality) 
- (BOOL)isEqualToUUID:(NSUUID*)other 
{ 
    return [self.UUIDString isEqualToString:other.UUIDString]; 
} 

// Only for completness 
- (BOOL)isEqual:(id)other 
{ 
    if([other isKindOfClass:[NSUUID class]]) 
    { 
    return [self isEqualToUUID:other]; 
    } 
    return NO; 
} 
@end 

КСТАТИ: Те же самые причины, которые заставляют вас чувствовать себя плохо, используя экземпляры NSString в качестве объекта уведомления не распространяется на случаи NSUUID?

BTW 2: Обработка CF-объектов в коде ARC не так уж трудна.

+0

В частности, поскольку я хочу фильтровать уведомления с использованием идентификатора в качестве объекта уведомления, поэтому я могу отправлять и регистрировать уведомления с минимальной проверкой и дополнительным кодом. Это возможно с nsmanagedobjectid. Я понимаю, что различие между nsstring и nsuuid было бы незначительным в этом случае, скорее соглашение, но у меня есть ощущение, что nsstring имеет дополнительные проверки компилятора. –

+0

Таким образом, приведенный выше код должен работать. Или я ошибаюсь? –

+0

На самом деле не уверен, что в документации NSNotification указано, что равенство указателя проверяется для локальных уведомлений, является переопределением isEqual: все, что требуется?Если я так думаю, но я, вероятно, создаю новый подкласс nsuuid, а не переопределяю в категории. –