在此用例中使用GCD dispatchAfter()时可能会出现什么问题

时间:2014-05-19 01:45:23

标签: macos cocoa grand-central-dispatch

我正在阅读一本关于OS X编程的书作为复习,并且有一个文档应用程序设置了一个数组控制器,tableView等。本章要求使用NSInvocation手动实现撤销支持。在本章中,他们要求添加一个创建员工方法并手动添加插件到NSArrayController,并将我的添加按钮连接到新方法而不是数组控制器。

相反,我用我的方法插入新对象:

-(void)insertObject:(Person *)object inEmployeesAtIndex:(NSUInteger)index {
NSUndoManager* undoManager = [self undoManager];

[[undoManager prepareWithInvocationTarget:self]removeObjectFromEmployeesAtIndex:index];

if (![undoManager isUndoing]) {
    [undoManager setActionName:@"Add Person"];
}
[self startObservingPerson:object];

[[self employees]insertObject:object atIndex:index];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    // Wait then start editing
    [[self tableView]editColumn:0 row:index withEvent:nil select:YES];
});

}

这个工作正常(看起来有点傻),但我想知道这会产生什么问题。我已经在其他地方完成了这项工作,以便在动画完成后执行代码(无法找到更好的方法)。

提前致谢。

1 个答案:

答案 0 :(得分:1)

为什么要推迟调用-editColumn:row:withEvent:select:

无论如何,风险在于这个-insertObject:...方法结束和分派任务执行之间会有其他事情发生。也许某些内容会改变表格视图的内容,使index不再引用刚刚添加的员​​工。