약 10 개의 개별 스레드를 실행할 수있는 매우 복잡한 iPad 응용 프로그램에서 작업하고 있습니다. 각 스레드는 코어 데이터를 사용하여 일부 데이터 IO 작업을 수행합니다. 나는 합병 과정을 단순화하기위한 간단하고 우아한 해결책을 내놓으려고 노력하고있다.NSManagedObjectContext 동시성
뒷이야기 내 애플은 내가 엔진라고 부르는 것을 사용
. 내 응용 프로그램에는 많은 엔진이있을 수 있습니다. 각 엔진은 특정 간격으로 연속 간격으로 실행됩니다. RSS 정리, 페치 및 병합, 테마 변경 사항 가져 오기 및 병합, 문서 가져 오기 및 병합. 각 엔진은 자체 스레드로 실행되며 각 스레드는 고유 한 관리 객체 컨텍스트를 사용합니다.
질문
오히려 엔진의 각 NSManagedObjectContextDidSaveNotification
을 관찰하는 것보다, 나는 NSManagedObjectContext
클래스에서 파생 는 IT가 관찰이/변경 사항을 병합 할 아이디어를 내놓았다.
누구든지이 방법을 둘러싼 문제 또는 문제점을 알고 있습니까?
.H
@interface SelfMergingManagedObjectContext : NSManagedObjctContext
@end
하는 .m
@interface SelfMergingManagedObjectContext()
-(void)observeDidSaveNotification;
@end
@implementation SelfMergingManagedObjectContext
-(id)initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct
{
..
..
..
[self observeDidSaveNotification];
return self;
}
-(id)init
{
..
..
..
[self observeDidSaveNotification];
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
..
..
..
[self observeDidSaveNotification];
return self;
}
-(void)observeDidSaveNotification
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil];
}
-(void)contextDidSave:(NSNotification *)notif
{
[self mergeChangesFromContextDidSaveNotification:notif];
}
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
@end
: 여기
은 어떻게 보이는지의
거친 예입니다
감사합니다. 병합 정책을 NSMergeByPropertyObjectTrumpMergePolicy로 설정했습니다. 컨텍스트 생성이 배경 스레드에서 발생할 수 있지만 병합 정책이 주 스레드에서 설정되지 않을 수도 있음을 의미합니다. 좋은 충고 .. 그걸 들여다 볼게! – Jeremy
병합이 일어나는 유일한 장소이므로 메인 스레드에 설정되어 있는지 확인하십시오 !! 배경 스레드의 병합 정책 설정은 항상 주 스레드 컨텍스트에 병합되므로 아무런 효과가 없습니다. –
나는 그것을 몰랐다. 다시 한 번 감사드립니다! – Jeremy