#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"];
}