문제

나는 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()
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top