我正在关注Apple的iCloud Programming Guide for Core Data,Using 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.'
根据该文件,这应该有用......我可能做错了什么?
由于
答案 0 :(得分:2)
错误:
Can only use -performBlock: on an NSManagedObjectContext that was created with a queue.
......非常清楚。除非使用其中一个队列类型并发选项创建该上下文,否则无法在托管对象上下文上调用performBlock:
。这意味着在创建上下文时,您必须使用initWithConcurrencyType:
和使用NSPrivateQueueConcurrencyType
或NSMainQueueConcurrencyType
作为参数。
这与通知完全无关,只是在您没有正确创建上下文的情况下调用performBlock:
这一事实。