【发布时间】:2013-12-28 08:32:24
【问题描述】:
我正在制作一个应用程序,它解析链接返回的 XML 并使用 Core Data 保存该数据。问题是,为了让 UI 保持响应,我必须在后台线程中进行所有解析。谷歌搜索了一段时间后,我在 AppDelegate 中设置了两个上下文,一个用于处理背景解析,一个用于加载 UI。
首先:这是为我的情况设置两个上下文的正确方法吗?
//In AppDelegate.m
//This one is for parsing in the background
- (NSManagedObjectContext *)backgroundManagedObjectContext {
if (_backgroundManagedObjectContext != nil) {
return _backgroundManagedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_backgroundManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_backgroundManagedObjectContext.persistentStoreCoordinator = coordinator;
}
return _backgroundManagedObjectContext;
}
//This one is for updating the UI
- (NSManagedObjectContext *)mainManagedObjectContext {
if (_mainManagedObjectContext != nil) {
return _mainManagedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_mainManagedObjectContext.persistentStoreCoordinator = coordinator;
_mainManagedObjectContext.parentContext = self.backgroundManagedObjectContext];
}
return _mainManagedObjectContext;
}
第二:这是调用各个同步和加载方法的正确方法吗?
然后我会调用我的同步方法(用于后台):
[self.appDelegate.backgroundManagedObjectContext performBlock:^{
[self syncData];
}
并调用我的加载方法(用于 UI)
[self.appDelegate.mainManagedObjectContext performBlock:^{
[self loadData];
}
第三:我的核心数据以一个实体(用户)为中心,所有其他实体都连接到该实体(用户)。我是否必须创建一个局部变量并在每次我想使用它时获取它,还是有更好的方法使 NSManagedObject 不会在两个线程之间共享?
第四:如果我保存了父背景上下文,子上下文(UI)会自动更新还是有我需要调用的特定方法?
【问题讨论】:
-
当
mainManagedObjectContext被调用时,_backgroundManagedObjectContext是否有可能成为nil? -
@AaronBrager 这就是我问这是否是正确设置的原因。我应该在
- (NSManagedObjectContext *)mainManagedObjectContext方法中检查吗? -
或者你可以使用
[self backgroundManagedObjectContext]而不是_ _backgroundManagedObjectContext,如果它没有被实例化,它会实例化它。 -
@AaronBrager 我编辑了问题以包含您的建议。你对我的任何更一般的问题有答案吗?
标签: ios objective-c