하위 그래프 내의 모든 변경 사항을 추적/관찰하려면 어떻게해야합니까?
-
20-09-2019 - |
문제
나는 nsmanagedObjectContext가 있는데, 여기에는 다른 일부가 다른 사람들을위한 컨테이너가되도록 여러 하위 클래스의 nsmanagedObjects가 있습니다. 내가하고 싶은 것은 속성, 연관성 또는 포함 된 객체의 속성/연관에 대한 변경 사항을 알리는 최상위 객체를 보는 것입니다.
컨텍스트의 'Haschanges'를 사용해도 충분히 세분성을주지 않습니다. 오브젝트 'Isupdated'방법은 주어진 객체에만 적용됩니다 (그리고 그 연관성은 아님). 편리한 (아마도 KVO 기반)가 서브 그래프로 제한되는 컨텍스트의 변화를 관찰 할 수 있었습니까?
해결책
당신은 듣고 싶을 것입니다 NSManagedObjectContextObjectsDidChangeNotification
데이터 모델의 모든 변경 사항을 선택합니다. 다음과 같은 코드를 사용하여 수행 할 수 있습니다.
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
트리거됩니다 -handleDataModelChange:
변경 사항에 myManagedObjectContext
문맥.
당신의 -handleModelDataChange
: 메소드는 다음과 같이 보입니다.
- (void)handleDataModelChange:(NSNotification *)note
{
NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];
// Do something in response to this
}
보시다시피, 알림에는 관리 된 객체가 업데이트, 삭제 및 삽입 된 정보가 포함되어 있습니다. 이 정보에서 데이터 모델 변경에 응답하여 행동 할 수 있어야합니다.
다른 팁
Swift의 간단한 예는 다음과 같습니다.
NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: nil, queue: nil) { note in
if let updated = note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>, updated.count > 0 {
print("updated: \(updated)")
}
if let deleted = note.userInfo?[NSDeletedObjectsKey] as? Set<NSManagedObject>, deleted.count > 0 {
print("deleted: \(deleted)")
}
if let inserted = note.userInfo?[NSInsertedObjectsKey] as? Set<NSManagedObject>, inserted.count > 0 {
print("inserted: \(inserted)")
}
}
나에게는 두 가지 기능을 따라 잃어버린 것일 수도 있습니다.
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
제휴하지 않습니다 StackOverflow