查看 Apple 文档,我看到他们建议从 AppDelegate 中删除 Core Data 初始化代码。他们的方法如下。
我不明白的是以下
- 文档中的以下句子。应用程序委托如何回调?我在下面的代码片段中没有看到。这是他们想要我们添加的东西吗?
通过使用完成块初始化一个单独的控制器对象,您已经将 Core Data 堆栈从应用程序委托中移出,但您仍然允许对应用程序委托进行回调,以便用户界面可以知道何时开始请求数据。
- AppDelegate 调用 DataController 的 init,而这又调用了 initializeCoreData。但是 initializeCoreData 在后台线程中设置持久存储协调器。这意味着如果我们转换到应用程序的第一个视图并且它的视图控制器从核心数据请求数据,事情还没有建立起来。这不会是个问题吗?这是否意味着他们希望我们显示不同的启动屏幕并注册一个回调,告诉我们 CoreData 初始化在移动到实际的第一个应用程序视图之前完成。
文档中的 AppDelegate 代码
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setDataController:[[DataController alloc] init];
// Basic User Interface initialization
return YES;
}
文档中的 DataController 代码
@interface MyDataController : NSObject
@property (strong) NSManagedObjectContext *managedObjectContext;
-(void)initializeCoreData;
@end
@implementation MyDataController
-(id)init {
self = [super init];
if (!self) return nil;
[self initializeCoreData];
return self;
}
- (void)initializeCoreData {
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert(mom != nil, @"Error initializing Managed Object Model");
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[moc setPersistentStoreCoordinator:psc];
[self setManagedObjectContext:moc];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"DataModel.sqlite"];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSError *error = nil;
NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
});
}