objective-c - 异步更新 NSTableView 数据源

标签 objective-c multithreading cocoa nstableview appkit

我一直在谷歌上搜索这个主题,但似乎无法就此类问题的解决方案达成共识。当我将数据源与 NSTableView 一起使用时,如果我需要在后台填充数据源,我的脑海中会出现几个有关线程的问题。我希望在这里得到一些指导。

  1. 如果我修改主线程调用 [NSTableView numberOfRowsInTableView:] 和 [NStableView tableView:objectValueForTableColumn:row:] 之间的数据源,会发生什么?如果 TableView 请求的对象不再有效,我该怎么办?

  2. 仅在主线程上更改数据源是否可以解决这种情况?

  3. 如果答案是 2,它是否适用于使用绑定(bind)的情况?

最佳答案

如果您的数据源需要一些时间来填充,并且您当前显示的是包含较旧数据的表格,我认为您有几个选择:

  • 在重新填充发生时在 UI 上显示旋转图标,然后调用 [tableView reloadData]
  • 保留旧数据,以便 tableView 保持响应,然后在获取/计算新数据后,告诉数据源有关新 NSArray(或保存新数据的任何对象)的信息,并调用 [tableView reloadData]。

您无法动态更改支持数据源的数据,除非您随时通知 tableView 每个项目/行的更改。

为了解决线程部分,您可以使用后台线程填充新数据的 NSArray,一旦完成切换到主线程,然后调用 [dataSource setBackingArray:newStuff]; [tableView重新加载数据];

关于objective-c - 异步更新 NSTableView 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24938725/

相关文章:

objective-c - 基于核心数据文档的基于选择的多个 Nib

android - Android 中使用 Canvas 和 SurfaceView 时的 Thread 或 Runnable

c# - 特定处理器同时运行的线程数是多少?

iphone - 如何退出方法?

ios - 阻止与 ios 配件的通信

objective-c - 静音 Cocoa 错误提示音

iphone - 如何使用 cgcontext 引用动态地将 100 X 100 图像制作为 1000X 1000

c++ - Windows API 线程池简单示例

cocoa - NSUndoManager 是否保留其参数?

objective-c - 将自动释放的 CGColor 返回到 ARC 的转换方法