Objective C — основные данные и NSFetchedResultController?

#objective-c #core-data #nsfetchedresultscontroller

#objective-c #основные данные #nsfetchedresultscontroller

Вопрос:

Итак, у меня есть выбранный контроллер результатов, который возвращает список объектов. Я пытаюсь обнаружить любые изменения в объекте, включая изменения в вложенных объектах

Объект обладает следующими свойствами (NSString myString, NSSNumber myNumber, Object2 myObject2)

таким образом, любые изменения myString и myNumber приведут к тому, что FetchedResultController уведомит делегата. Но изменения myObject2 свойств не приведут к тому, что fetchedResultController вызовет делегат.

Я делаю что-то не так? Должен ли я вручную сообщить MyObject, что он должен уведомить fetchedResultController?

Комментарии:

1. Когда вы говорите «изменения myObject2 свойств», имеете ли вы в виду, что вы внесли изменения в объект и сохранили контекст управляемого объекта?

Ответ №1:

Когда вы «изменяетесь» myString , и ваш NSFetchedResultsController (NSFR) отвечает своим событием, вам нужно понять, что происходит на самом деле.

NSFRC использует наблюдение за значением ключа, чтобы увидеть ваши изменения. Теперь предположим yourObj , что это ваш объект, о котором вы упомянули выше, и поэтому, когда вы вводите: yourObj.myString = @"New String" или [yourObj setMyString:@"New String"] любые получатели, наблюдающие это свойство (ваш NSFRC!), Будут уведомлены, потому что для вашего объекта вызывается установщик.

Следовательно, вы не получаете уведомления о своем «подобъекте», как вы его назвали, потому что вы обращаетесь не к свойству, которое отслеживается NSFRC, а к свойству вашего подобъекта.

Чтобы вызвать уведомление о вашем подобъекте, вам нужно будет вызвать установщик подобъектов для вашего объекта. (т.е. [myObj setObject2:obj2] )

Ответ №2:

Итак, вот ответ:

реализуйте следующие методы в дочернем классе (myObject2), и при каждом изменении ключевого значения уведомляйте класс владельца

 - (void)willChangeValueForKey:(NSString *)key
{
   [super willChangeValueForKey:key];
   [self.myMainObject willChangeValueForKey:@"myObject2"];
}

- (void)didChangeValueForKey:(NSString *)key
{
   [super didChangeValueForKey:key];
   [self.myMainObject didChangeValueForKey:@"myObject2"];
}