我的应用程序中有一项操作,需要使用Core Data进行大量的,有时需要几秒钟的更新。因为我想做的不仅仅是展示一个微调器,我想向最终用户显示一个进度条。然而,这提出了一些问题,因为Core Data坚持在主线程上运行。我试图将Core Data放在具有dispatch_async
的后台线程上,并带来灾难性的后果。问题是UIKit还想在主线程上运行,更糟糕的是,只在当前线程结束后进行更新。这导致进度条只有在完成所有处理后才会更新!
如何更新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];
答案 0 :(得分:1)
Core Data不需要在主线程上工作,只需要为每个单独的线程都有一个NSManagedObjectContext。在单独的线程上使用相同的后备存储创建一个新的NSManagedObjectContext(使用NSOperationQueue)并在那里进行处理。从备用线程保存NSManagedObjectContext后,主线程的上下文将从后备存储中获取更改。要从备用线程更新UI,请使用
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
这是NSObject上的一个方法。如果有什么不清楚的话,祝你好运和评论。