我是iOS编程新手,我一直在使用GCD初始化Core Data堆栈。 我已经试过(代码AppDelegate.m): 如何同时初始化核心数据堆栈?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
bgQueue = dispatch_queue_create("com.example.coredata.init", DISPATCH_QUEUE_SERIAL);
dispatch_async(bgQueue, ^{
NSPersistentStoreCoordinator *psc = [self persistentStoreCoordinator];
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:psc];
dispatch_async(dispatch_get_main_queue(), ^{
_mainThreadManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainThreadManagedObjectContext setParentContext:_managedObjectContext];
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
MasterViewController *controller = (MasterViewController *)navigationController.topViewController;
controller.managedObjectContext = _mainThreadManagedObjectContext;
});
});
}
然而,dispatch_async内的块(dispatch_get_main_queue())不执行和应用失败,错误“无不是合法的NSManagedObjectContext参数“当应用程序的其他部分试图使用NSManagedObjectContext时。
那么,我应该在哪里初始化核心数据对象?也许在MasterViewController中?或者有可能等待NSManagedObjectContext初始化?感谢帮助。
您确定您没有比赛条件吗?你正在调度这个块异步...我猜想别的东西正在利用它,在块完成之前。您始终可以使用dispatch_semaphore来表示上下文已初始化。 – smyrgl