2011-01-19 2 views
2

У меня есть NSManagedObject (человек), у которого есть несколько наблюдателей, зарегистрированных на вложенное неуправляемое свойство (person.address.street, адрес неуправляемый, т. Е. Не определенный в Core Data). Когда управляемый объект получает нарушенный, я называюDoes - [NSManagedObject willTurnIntoFault] отключить уведомления KVO?

person.address = nil 

в willTurnIntoFault, чтобы очистить мою неуправляемую собственность. Однако KVO не удаляет наблюдателей, зарегистрированных для адреса, чтобы получать уведомления об изменениях на «улицу», хотя адрес соответствует требованиям KVO. Адрес освобождается, и я получаю предупреждение о том, что у него все еще есть зарегистрированные наблюдатели.

Единственная причина, по которой я могу понять, что willTurnIntoFault отключает уведомления KVO. Это так? Есть ли обходной путь для этого.

Спасибо, Jochen

ответ

-2

Вы можете, используя технику, которые описывают в http://developer.apple.com/library/mac/#releasenotes/Cocoa/FoundationOlder.html Чтобы избежать этой ошибки, и можно с помощью другого ключевого ресурса в связывании, который будет включать в себя объект, с КВО совместимым. Обратите внимание: «Поддержка отладки требований« плохого соответствия требованиям KVO »и« Рекомендации по исправлению одного из требований плохого соответствия требованиям KVO ».

+0

Какую технику вы относите в документе? Я не мог найти ничего там, что относится к этой проблеме, за исключением, может быть, использования setKeys: triggerChangeNotificationsForDependentKey :, но это устарело. – Jochen

1

Йохен,

я вижу такое же поведение, как часть управляемой обработки объект контекста слияния (через mergeChangesFromContextDidSaveNotification :). Для «обновленных» объектов в информации о слиянии пользователя основные данные сбрасывают объект «локального» контекста, а затем выполняют слияние с объектом «удаленного» контекста.

Если, как часть didTurnIntoFault: обработка, я освобождаю свое неуправляемое свойство (что очень просто и точно соответствует KVO), появляется ошибка. Интересно, что это только происходит с «вложенными» неуправляемыми свойствами. У меня есть много других неуправляемых свойств как часть моих управляемых объектов, которые являются простыми объектами (NSNumber, NSString и т. Д.), И они могут быть выпущены как часть didTurnIntoFault: обработка без каких-либо проблем. Только когда в неуправляемом свойстве обнаруживаются свойства> = 2 уровня, я вижу проблему.

Я не уверен, что вы нашли решение или еще не было (мне было бы очень интересно узнать, как вы прогрессировали с этим), но я нашел обход. Я оставляю свое неуправляемое имущество, выделенное в поврежденном объекте, и освобождаю его только во время подготовки к редактированию.

-(void) performInventoryItemObjectSetup 
{ 
    if ([self unitsManager] == nil) { 
     [self setUnitsManager:[[[BTUnitsManager alloc] init] autorelease]]; 
    } 
    ... 
} 

-(void) performInventoryItemObjectCleanup 
{ 
    ... 
} 

/********************/ 

-(void) awakeFromInsert 
{ 
    //NSLog(@"InventoryItem: awakeFromInsert"); 
    [super awakeFromInsert]; 
    [self performInventoryItemObjectSetup]; 
} 

-(void) awakeFromSnapshotEvents:(NSSnapshotEventType)flags 
{ 
    //NSLog(@"InventoryItem: awakeFromSnapshotEvents: 0x%lx", flags); 

    [super awakeFromSnapshotEvents:flags]; 

    if (flags & NSSnapshotEventUndoDeletion) { 
     [self performInventoryItemObjectSetup]; 
    } 
} 

-(void) awakeFromFetch 
{ 
    //NSLog(@"InventoryItem: awakeFromFetch"); 
    [super awakeFromFetch]; 
    [self performInventoryItemObjectSetup]; 
} 

-(void) didTurnIntoFault 
{ 
    //NSLog(@"InventoryItem: didTurnIntoFault"); 
    [self performInventoryItemObjectCleanup]; 
    [super didTurnIntoFault]; 
} 


-(void) prepareForDeletion 
{ 
    NSLog(@"InventoryItem: prepareForDeletion"); 
    [self setUnitsManager:nil]; 
    [super prepareForDeletion]; 
} 

Я подозреваю, больше людей будут работать в этот вопрос, как все больше и больше приложений Основных данных выпускаются с поддержкой ICloud, которая требует такого рода объединение как часть обработки NSPersistentStoreDidImportUbiquitousContentChangesNotification. Либо это, либо мы выясним, что мы делаем неправильно :-).

Cheers, Michael.

+0

Только что понял, что я еще не пробовал работать в readyForDeletion. Я попробую завтра. Если он также работает, я бы назвал это более подходящим для решения проблемы, чем переопределение dealloc. – ozpowell

+0

Использование prepareForDeletion отлично работает и является лучшим решением для решения этой проблемы. – ozpowell

Смежные вопросы