作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个与 9gag 应用程序非常相似的应用程序,并且我正在努力实现平滑滚动,所以我试图将所有内容都从主线程中删除。给我带来麻烦的是核心数据。
我有一个 PhotoSource 类,它创建自己的线程,如下所示:
@property (nonatomic) dispatch_queue_t photoSourceThread;
<br/>...
<br/>dispatch_async(self.photoSourceThread, ^{
...
});
我还有另一个类,它只处理核心数据:
@property (nonatomic, strong) TLCoreDataManager *coreDataManager;
PhotoSource 类中的一切都发生在它的线程内,包括对 TLCoreDataManager 的调用,如下所示:
dispatch_async(self.photoSourceThread, ^{
Photo *storedPhoto = [self.coreDataManager getPhotoWithURLString:urlString];
...
});
有时它可以工作,但在应用程序启动后,我从我的 NSFetchRequest[s] 中得到 0 个结果,我不知道该怎么做。任何想法可能是错误的?如果您需要更多代码,请告诉我!
谢谢
最佳答案
要在多线程环境中使用 CoreData 来改变您的数据并最终更新您的 GUI,您需要将更改合并到基于主队列的上下文(由基于核心数据的应用程序生成的默认代码中的默认上下文)。我建议您使用获取结果 Controller 来监听对您的数据所做的更改。
你可以使用类似的东西:
/*!
@see http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html
*/
- (void) doSomethingInBackgroundWithoutBlocking:(NSPersistentStoreCoordinator*)coordinator
{
NSManagedObjectContext* bgContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[bgContext setPersistentStoreCoordinator:coordinator];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:) //merge to your main context
name:NSManagedObjectContextDidSaveNotification
object:bgContext];
[bgContext performBlock:^{
//Do somethig with your persistent store data
//Objects fetched here will only be available for this context
//And on its own queue
//Probably need to save & merge to main context so that the fetch results controller will be updated
//remove the observer
}];
}
关于ios - 如何在它自己的线程中使用核心数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15740330/
我是一名优秀的程序员,十分优秀!