我有多个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与它创建的线程绑定在一起。我想任何关于我哪里出错的指针都是有帮助的。
与所有操作中使用的“adHocManagedObjectContext”是否相同?如果这些操作并行运行,那将会是一个问题,因为MOC不是线程安全的。 –
@MartinR嗨,我也添加了该代码。每次打电话时,我都会创建一个具有相同持久性商店协调员的新MOC。 – rob5408
您的MOC设置对我来说看起来很好(它是针对每个线程创建的)。你能否详细说明你的问题的性质,你的意思是由A类创建,然后是B类创建的?有没有缺失的物品? (不要忘记删除观察者)。 –