如何更新UI以显示Core Data长时间运行的进程?

时间:2011-12-23 16:45:31

标签: iphone multithreading core-data

我的应用程序中有一项操作,需要使用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];

1 个答案:

答案 0 :(得分:1)

Core Data不需要在主线程上工作,只需要为每个单独的线程都有一个NSManagedObjectContext。在单独的线程上使用相同的后备存储创建一个新的NSManagedObjectContext(使用NSOperationQueue)并在那里进行处理。从备用线程保存NSManagedObjectContext后,主线程的上下文将从后备存储中获取更改。要从备用线程更新UI,请使用

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

这是NSObject上的一个方法。如果有什么不清楚的话,祝你好运和评论。