나는 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];
게시하기 전에이 작업을 시도했지만 다른 managedObjectContext에서 개체를 삭제할 수 없다는 오류가 발생했습니다. –
NSManagedObjects 컨텍스트간에 전달할 때 해당 오류가 발생합니다. 대체 스레드의 컨텍스트에서 작업하는 경우 수정하려는 개체의 컨텍스트를 쿼리해야합니다. 각 스레드는 완전히 별개로 작동해야합니다. 공유 할 수있는 유일한 물건은 후원 가게입니다. –
그게 배경 스레드에 넣어 함께 문제가됐다. 컨텍스트를 매개 변수로 받아들이도록 코드를 수정하고 내 'dispatch_async' 블록에서 생성 된 새 컨텍스트를 전달했습니다. 그런 다음 UI를 업데이트하기 위해 주 스레드에서 실행할 새 GCD 스레드를 만들었습니다. 매력처럼 일했습니다! : D –