我创建了多个 NSInvocationOperations 并将其添加到 NSOperationQueue。其中两个 NSInvocationOperations 创建了同一个父类的许多对象(Country 和 City 是 Location 的子类)。除了我注意到一个模型的变化或另一个模型有点被破坏之外,它大部分都很顺利。
查看商店(使用 sqlite 程序),我看到创建了第一个城市(可能总共 200 个),然后创建了所有国家(再次可能是 200 个)。如果我删除该应用程序并再次运行它,我将看到第一个国家,然后是所有城市。
我点击了文档并注意到 Apple 建议在您的 NSOperation 的启动方法中设置您的每个线程 MOC。但是我没有使用 NSOperation,我使用的是 NSInvocationOperation。这实际上让我更加质疑,为什么他们建议一开始就创建你的 MOC。
这是我的 NSInvocationOperation 的选择器...
+ (void)load:(NSString *)file
{
NSManagedObjectContext *managedObjectContext = [(OSSMAppDelegate *)[[UIApplication sharedApplication] delegate] adHocManagedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:managedObjectContext];
SBJsonParser *jsonParser = [[SBJsonParser alloc] init];
NSString *json = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@"json"]];
NSArray *objects = [[jsonParser objectWithString:json] valueForKeyPath:@"objects"];
for(NSDictionary *object in objects)
{
[self createObjectWithObject:object inManagedObjectContext:managedObjectContext];
}
NSError *error = nil;
[managedObjectContext save:&error];
}
...来自应用委托...
- (NSManagedObjectContext *)adHocManagedObjectContext
{
NSManagedObjectContext *adHocManagedObjectContext = nil;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
adHocManagedObjectContext = [[NSManagedObjectContext alloc] init];
[adHocManagedObjectContext setPersistentStoreCoordinator:coordinator];
[adHocManagedObjectContext setUndoManager:nil];
}
return adHocManagedObjectContext;
}
...然后在其他地方(注意:firstRun 调用 load:)...
NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];
在被调用的选择器中创建 MOC 有什么问题吗?我认为它必须是因为 MOC 与它创建的线程相关联。我想任何关于我哪里出错的指示都是有帮助的。