核心数据& iCloud:收到NSPersistentStoreCoordinatorStoresWillChangeNotification时的异常

时间:2015-02-14 15:33:17

标签: ios core-data objective-c-blocks icloud nsoperationqueue

我正在关注Apple的iCloud Programming Guide for Core DataUsing the SQLite Store with iCloud部分,并告诉您以这种方式收听NSPersistentStoreCoordinatorStoresWillChangeNotification iCloud事件:

[[NSNotificationCenter defaultCenter] addObserverForName:NSPersistentStoreCoordinatorStoresWillChangeNotification
                                                  object:self.managedObjectContext.persistentStoreCoordinator
                                                   queue:[NSOperationQueue mainQueue]
                                              usingBlock:^(NSNotification *note) {
                                                  [self.managedObjectContext performBlock:^{
                                                      // disable user interface with setEnabled: or an overlay

                                                      if ([self.managedObjectContext hasChanges]) {
                                                          NSError *saveError;
                                                          if (![self.managedObjectContext save:&saveError]) {
                                                              NSLog(@"Save error: %@", saveError);
                                                          }
                                                      }
                                                      else {
                                                          // drop any managed object references
                                                          [self.managedObjectContext reset];
                                                      }
                                                  }];
                                              }];

我已将此类代码放入我的AppDelegate application:didFinishLaunchingWithOptions:方法中,并且在收到通知后,我会收到此例外情况:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.'

根据该文件,这应该有用......我可能做错了什么?

由于

1 个答案:

答案 0 :(得分:2)

错误:

Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.

......非常清楚。除非使用其中一个队列类型并发选项创建该上下文,否则无法在托管对象上下文上调用performBlock:。这意味着在创建上下文时,您必须使用initWithConcurrencyType: 使用NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType作为参数。

这与通知完全无关,只是在您没有正确创建上下文的情况下调用performBlock:这一事实。