2011-07-27 2 views
0

왜 내 NSManagedObjectContext save 호출 할 때마다 :NSManagedObjectContext를 저장하면 앱이 무한정 대기합니다.

-(NSManagedObjectContext*)managedObjectContext { 
    NSMutableDictionary* threadDictionary = [[NSThread currentThread] threadDictionary]; 
    NSManagedObjectContext* backgroundThreadContext = [threadDictionary objectForKey:RKManagedObjectStoreThreadDictionaryContextKey]; 
    if (!backgroundThreadContext) { 
     backgroundThreadContext = [self newManagedObjectContext]; 
     [threadDictionary setObject:backgroundThreadContext forKey:RKManagedObjectStoreThreadDictionaryContextKey]; 
     [backgroundThreadContext release]; 

     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(mergeChanges:) 
                name:NSManagedObjectContextDidSaveNotification 
                object:backgroundThreadContext]; 
    } 
    return backgroundThreadContext; 
} 

- (NSError*)save { 
    NSManagedObjectContext* moc = [self managedObjectContext]; 
    NSError *error = nil; 

    @try { 
     if (![moc save:&error]) { //breakpoint in here 

    //some code 
} 

응용 프로그램을 영원히 기다리는 것으로 보입니다 및 실행 다시 시작 결코? 다음은 video에서의 의미입니다. 엔티티/관계 모델에 문제가있어이 문제가 발생할 수 있습니까?

누출 도구의 스크린 샷은 어떤 누출도 보이지 않지만 앱이 무언가를 할당하고있는 것 같습니다 :

enter image description here

+0

악기는 악기 아래에서 앱을 실행하고 진행 상황을 볼 수 있습니다. – ImHuntingWabbits

+0

가능한 [스레드 및 코어 데이터가 포함 된 ipad 앱의 mmap 오류] 중복 (0120 개 & nbsp; //www.adackoverflow.com/questions/6853183/mmap-error-on-ipad-app-with-threading-and-core-data) –

답변

-1

당신이 당신의 멀티 스레딩 틈을 파고 시도 되세요 코드가 작동하는지 확인 하시겠습니까? 내 생각 엔 여기 스레드를 혼합하고 다른 스레드에서 MOC에 액세스/저장하는 것입니다. 수동으로 스레드를 관리하는 것은 PITA이므로 Grand Central Dispatch으로 전환해야합니다. 신속하게 만들 수 - (NSManagedObjectContext*)newBackgroundMOC;- (void)saveBackgroundMOC:(NSManagedObjectContext*)context; 방법 및 배경 큐/스레드에서 MOCS을 저장 : 당신이 백그라운드 스레드에서 호출되지 않습니다 있는지 확인하고 몇 가지를 가질 수 있도록

또한 메인 MOC에게 자신의 접근을 줄 것이다

dispatch_async(my_queue, ^{ 
    NSManagedObjectContext *context = [self newBackgroundMOC]; // create context, setup didSave notification to merge with main MOC, etc 

    // modify context 

    [self saveBackgroundMOC:context]; // main MOC gets updated 
}); 

GCD 로의 마이그레이션은 약간의 작업이지만, 장기적으로는 작업하는 것이 훨씬 더 즐겁습니다. 스레드를 처리하는 것이 가장 현대적이고 권장되는 Apple 방식이라고 할 수 있습니다.

+0

계측기 누출 프로파일 러의 스크린 샷으로 내 질문을 편집했습니다. – aherlambang

관련 문제