2011-12-23 1 views
2

나는 Core Data로 크고, 때로는 몇 초간의 업데이트가 필요한 작업이있다. 회 전자를 표시하는 것 이상을하고 싶기 때문에 최종 사용자에게 진행률 표시 줄을 표시하고 싶습니다. 그러나 핵심 데이터가 주 스레드에서 실행되도록 주장하기 때문에 이러한 문제가 발생합니다. 나는 코어 데이터를 dispatch_async와 배경 스레드에 끼워 넣으려고 시도했지만 재앙적인 결과를 가져왔다. 문제는 UIKit 또한 주 스레드에서 실행하려고하고 현재 스레드가 종료 된 후에 만 ​​업데이트를 수행한다는 것입니다. 결과적으로 모든 처리가 완료 될 때까지 진행률 표시 줄 만 업데이트됩니다!핵심 데이터 장기 실행 프로세스를 표시하기 위해 UI를 업데이트하는 방법은 무엇입니까?

UI를 업데이트하고 안전하게 데이터를 업데이트 할 수있는 방법은 무엇입니까?

NSArray* items = [[response.data objectForKey:@"result"] objectForKey:@"items"]; 

NSManagedObjectContext* context = [RBGameItemController sharedInstance].managedObjectContext; 

int itemCount = [items count]; 

for (int i = 0; i < itemCount; i++) { 
    float progress = ((float)i/(float)itemCount)*0.95f; 
    self.progressView.progress = 0.5f + progress; 

    id item = [items objectAtIndex:i]; 
    [GameItem gameItemFromDictionary:item inManagedObjectContext:context]; 
} 

NSError* error = nil; 
[context save:&error]; 

답변

1

코어 데이터는 주 스레드에서 작업 할 필요가 없으며 각 스레드마다 NSManagedObjectContext가 있어야합니다. 별도의 스레드 (NSOperationQueue 사용)에서 동일한 백킹 저장소를 사용하여 새 NSManagedObjectContext를 만들고 거기에서 처리합니다. 대체 스레드에서 NSManagedObjectContext를 저장하면 주 스레드의 컨텍스트가 백업 저장소의 변경 사항을 선택합니다. 대체 스레드에서 UI를 업데이트하려면, NSObject의의 방법이다

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; 

를 사용합니다. 아무 것도 명확하지 않으면 행운을 비네.

+0

게시하기 전에이 작업을 시도했지만 다른 managedObjectContext에서 개체를 삭제할 수 없다는 오류가 발생했습니다. –

+0

NSManagedObjects 컨텍스트간에 전달할 때 해당 오류가 발생합니다. 대체 스레드의 컨텍스트에서 작업하는 경우 수정하려는 개체의 컨텍스트를 쿼리해야합니다. 각 스레드는 완전히 별개로 작동해야합니다. 공유 할 수있는 유일한 물건은 후원 가게입니다. –

+0

그게 배경 스레드에 넣어 함께 문제가됐다. 컨텍스트를 매개 변수로 받아들이도록 코드를 수정하고 내 'dispatch_async' 블록에서 생성 된 새 컨텍스트를 전달했습니다. 그런 다음 UI를 업데이트하기 위해 주 스레드에서 실행할 새 GCD 스레드를 만들었습니다. 매력처럼 일했습니다! : D –

관련 문제