我创建了多个NSInvocationOperations并将其添加到NSOperationQueue中。其中两个NSInvocationOperations创建了相同父类(Country和City的子类Location)的许多对象。它基本上进行得很顺利,除了我注意到一个模型或另一个模型的更改有点受挫。
查看商店(使用sqlite程序),我看到创建了第一个City (总共可能有200个),然后创建了所有国家(也可能是200个)。如果我删除应用程序并再次运行它,我将看到第一个国家,然后是所有城市。
我查看了文档,注意到苹果建议在you NSOperation的start方法中设置每个线程的MOC。但是,我使用的不是NSOperation,而是NSInvocationOperation。这实际上让我产生了更多的疑问,所以为什么他们建议在start中创建你的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];}
...from应用程序委派...
- (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调用...then:)...
NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];在被调用的选择器中创建MOC有什么问题吗?我想这是必须的,因为MOC与创建它的线程绑定在一起。我想任何关于我哪里出错的建议都是有帮助的。
发布于 2013-04-19 01:34:40
我不确定我是否理解您的问题(您是否缺少国家或城市?您是否有错误的订单?举一个‘clobbered’的例子)。
至于你的问题:
在被调用的选择器中创建
有什么问题吗?
不,没有问题。文档只说它必须在您打算使用它的线程上创建(start和main是将在操作线程上运行的方法)。因此,NSInvocationOperation将在操作线程中运行您的方法,您可以在那里创建您的MOC而无需担心。
https://stackoverflow.com/questions/16067552
复制相似问题