0

我有多个NSInvocationOperations创建并添加到NSOperationQueue。其中两个 NSInvocationOperations创建大量同一父类(Country和City,子类位置)的对象。除了我注意到一个模型发生了变化或者其他模型发生了变化之外,它大部分情况都很好。哪里为NSInvocationOperation创建NSManagedObjectContext

看着商店(使用sqlite程序)我看到创建了第一个城市(可能有200个),然后创建了所有的国家(也可能是200个)。如果我删除应用程序并再次运行,我会看到第一个国家和所有城市。

我点击了文档,发现Apple建议在您的NSOperation的启动方法中设置您的每个线程MOCs。不过,我没有使用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呼叫加载:)...

NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil]; 
[operationQueue addOperation:countryInvocationOperation]; 

在被调用的选择器中创建MOC是否有任何问题?我想它应该是因为MOC与它创建的线程绑定在一起。我想任何关于我哪里出错的指针都是有帮助的。

+0

与所有操作中使用的“adHocManagedObjectContext”是否相同?如果这些操作并行运行,那将会是一个问题,因为MOC不是线程安全的。 –

+0

@MartinR嗨,我也添加了该代码。每次打电话时,我都会创建一个具有相同持久性商店协调员的新MOC。 – rob5408

+0

您的MOC设置对我来说看起来很好(它是针对每个线程创建的)。你能否详细说明你的问题的性质,你的意思是由A类创建,然后是B类创建的?有没有缺失的物品? (不要忘记删除观察者)。 –

回答

0

我不确定我是否理解您的问题(您是否缺少国家或城市?您有错误的订单吗?举一个'破坏'的例子)。

至于你的问题:

是否与创建就是BEING援引商务部在选择任何问题吗?

不,没有问题。文档只说它必须在您打算使用它的线程上创建(startmain是将在运行线程上运行的方法)。因此,NSInvocationOperation将在操作线程中运行你的方法,并且你可以在那里创建你的MOC而不用担心。

+0

有时我会看到一个城市创建,然后200个国家。如果我删除该应用并重试,则可能会看到一个国家和200个城市。所以我知道我编写的代码循环遍历JSON并创建新的对象。有时在创建一堆城市之后,它们在合并上下文后不会持续。我应该能够在不同的线程上创建相同(基本)类型的对象,并在所有事情都说完之后将它们全部放在商店中,对吗?我会继续运行它,看看是否出现模式。 – rob5408

+0

保存上下文时,我不知道数据clobbering存在任何问题。我建议您在创建过程中和保存(插入,删除,更新的上下文集合)之前打印您在'createObjectWithObject:inManagedObjectContext:'中生成的对象,并验证您创建的所有对象是否存在。如果在保存之前你看到上下文中的所有对象,并且它们仍然从数据库中丢失(并且没有错误),那么你可能会遇到问题。 –

+0

嗨Dan,昨晚我跑了50多次,并且无法得到我前几天看到的东西。不知道发生了什么变化。谢谢你的帮助! – rob5408