Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在本用例中使用GCD dispatchAfter()时会出现什么问题_Macos_Cocoa_Grand Central Dispatch - Fatal编程技术网

Macos 在本用例中使用GCD dispatchAfter()时会出现什么问题

Macos 在本用例中使用GCD dispatchAfter()时会出现什么问题,macos,cocoa,grand-central-dispatch,Macos,Cocoa,Grand Central Dispatch,作为复习,我正在阅读一本关于OSX编程的书,并用数组控制器、tableView等设置了一个文档应用程序。本章要求使用NSInvocation手动实现撤销支持。在本章中,他们要求添加一个createemployee方法,手动将outlets添加到NSArrayController,并将我的add按钮连接到新方法而不是数组控制器 相反,我使用插入新对象的方法执行此操作: -(void)insertObject:(Person *)object inEmployeesAtIndex:(NSUInteg

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

相反,我使用插入新对象的方法执行此操作:

-(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];
});
}

这是可行的(看起来有点傻),但我想知道这会产生什么问题。我在其他地方这样做是为了在动画完成后执行代码(找不到更好的方法)


提前感谢。

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


无论如何,风险在于,在这个
-insertObject:…
方法结束和执行分派的任务之间,还将执行其他操作。可能会更改表视图的内容,使得
索引
不再引用刚刚添加的员工。

在执行块中的代码之前,该方法仍然返回,不是吗?“仍然”?我不知道你指的是什么。是的,如果使用
dispatch\u after()
dispatch\u async()
分派任务,则调用者不必等待该任务完成即可继续执行。“为什么要延迟调用-editColumn:row:withEvent:select:?”似乎我的数组控制器没有更新表视图,直到方法返回后才更新表视图,这就是为什么我要在之后使用dispatch\u。这个
-insertObject:…
?有文件证明,诸如
-add:
-insert:
、和
-remove:
NSArrayController
方法会延迟其结果。但是,如果您直接操作模型,阵列控制器应该立即反映更改,尽管我不希望在插入完成之前反映更改。我将把您在这里尝试做的事情转移到操纵模型的控制器方法。无论如何,模型不适合执行这些视图操作。如果在添加/插入对象时需要自定义行为,我会将这些操作定向到文档控制器(而不是属性访问器中)。在这里,您应该使用同步的阵列控制器方法(例如
-addObject:
而不是
-add:
),然后启动编辑。