背景
多线程核心数据应用程序
NSTreeController
并NSOutlineView
带有绑定在背景上下文的 NSOperation 中创建子对象
使用合并到主要上下文中
mergeChangesFromContextDidSaveNotification
问题
如果我将 20 个子对象创建操作排队,一旦合并完成,我在大纲视图中只看到大约 10-15 个子对象。
如果我将最大并发操作数设置为 1,它会完美运行,我会看到 20 个孩子。
问题
我想做的事是不可能的吗?我可以看到核心数据可能如何难以成功地进行合并。还是我的代码有问题?
代码
JGGroupController
-(id)init {
self = [super init];
queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:10]; // If this is 1, it works like a dream. Anything higher and it bombs.
return self;
}
-(IBAction)addTrainingEntryChild:(id)sender {
moc = [[NSApp delegate] managedObjectContext];
JGTrainingBase *groupToAddTo = [[tree selectedObjects] objectAtIndex:0];
for (NSUInteger i = 0; i < 20; i++) {
JGAddChildrenObjectOperation *addOperation = [[JGAddChildrenObjectOperation alloc] init];
[addOperation addChildObjectToGroup:[groupToAddTo objectID]];
[queue addOperation:addOperation];
}
}
JGAddChildrenObjectOperation - NSOperation 子类
-(id)addChildObjectToGroup:(NSManagedObjectID *)groupToAddToID_ {
groupToAddToObjectID = groupToAddToID_;
return self;
}
-(void)main {
[self startOperation];
JGTrainingBase *groupToAddTo = (JGTrainingBase *)[imoc objectWithID:groupToAddToObjectID];
JGTrainingBase *entryChildToAdd = [JGTrainingBase insertInManagedObjectContext:imoc];
[groupToAddTo addChildren:[NSSet setWithObject:entryChildToAdd]];
[imoc save];
[self cleanup];
[self finishOperation];
}
-(void)mergeChanges:(NSNotification *)notification {
NSManagedObjectContext *mainContext = [[NSApp delegate] managedObjectContext];
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
}
-(void)startOperation {
// Omitted - Manage isExecuting, isPaused, isFinished etc flags
imoc = [[NSManagedObjectContext alloc] init];
[imoc setPersistentStoreCoordinator:[[NSApp delegate] persistentStoreCoordinator]];
[imoc setUndoManager:nil];
[imoc setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
[imoc setStalenessInterval:0];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:imoc];
}
-(void)finishOperation {
// Omitted - Manage isExecuting, isPaused, isFinished etc flags
}