2012-02-15 6 views
-1

약 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 
: 여기

은 어떻게 보이는지의 거친 예입니다

답변

3

일반적으로 NSManagedObjectContext에서 해당 종류의 항목이 범주로 수행됩니다. 확장 방식을 사용하여 머리 꼭대기에서 문제가 발생하지 않는다. 올바른 유형을 얻는 데 사용할 관리 객체 컨텍스트를 항상 만드는 한.

여러 관리되는 개체 컨텍스트를 사용하여 머리를 맞 춥니 다. 주 스레드에서 관리되는 개체 컨텍스트에 대한 병합 정책을 설정해야합니다. 기본값은 병합시 예외를 throw합니다. 가능한 병합을 아주 작게 유지하려고 노력하십시오.

+0

감사합니다. 병합 정책을 NSMergeByPropertyObjectTrumpMergePolicy로 설정했습니다. 컨텍스트 생성이 배경 스레드에서 발생할 수 있지만 병합 정책이 주 스레드에서 설정되지 않을 수도 있음을 의미합니다. 좋은 충고 .. 그걸 들여다 볼게! – Jeremy

+0

병합이 일어나는 유일한 장소이므로 메인 스레드에 설정되어 있는지 확인하십시오 !! 배경 스레드의 병합 정책 설정은 항상 주 스레드 컨텍스트에 병합되므로 아무런 효과가 없습니다. –

+0

나는 그것을 몰랐다. 다시 한 번 감사드립니다! – Jeremy