macos - 在此用例中使用 GCDdispatchAfter() 时可能会出现哪些问题

标签 macos cocoa grand-central-dispatch

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

相反,我用插入新对象的方法来做到这一点:

-(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)任务执行之间会执行其他操作。也许会更改 TableView 的内容,使 index 不再引用刚刚添加的员​​工。

关于macos - 在此用例中使用 GCDdispatchAfter() 时可能会出现哪些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728655/

相关文章:

python - Applescript 使用了错误的 python 版本,如何更改?

objective-c - macOS kexts 能否将代码注入(inject)特定进程(就像 mach_inject 那样)?

swift - 如何保证Grand Central Dispatch中的一项功能接连运行?

ios - 从进入主队列后,UI 变得无响应

ios - 有没有办法实现dispatch_cancel()?

objective-c - NSRulerView 如何正确对齐行号与正文

macos - 根据字符串的长度更新 NSTextField 的大小

swift - 带页眉和页脚的 NSCollectionView

objective-c - PDFKit 中的内存泄漏与这个简单的代码?

asp.net-mvc - Visual Studio for Mac-错误 CS1902