【问题标题】:Updating NSTableView datasource asynchronously异步更新 NSTableView 数据源
【发布时间】:2017-09-06 00:31:39
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: objective-c multithreading cocoa nstableview appkit


    【解决方案1】:

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

    • 在重新填充时在 UI 上显示一个微调器,然后调用 [tableView reloadData]
    • 保留旧数据,以便 tableView 保持响应,然后在获取/计算新数据后,告诉数据源新的 NSArray(或任何保存新数据的对象),并调用 [tableView reloadData]。

    您不能即时更改支持数据源的数据,除非您通知 tableView 每个项目/行随时更改。

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

    【讨论】:

    • 格雷厄姆,从概念上讲,我明白你在说什么。但在我看来,我修改数据源和调用 [tableView reloadData] 之间发生的事情是关键。例如:1) 主线程调用 [NSTableView numberOfRowsInTableView:],2) 我在另一个线程上清除数据源,3) 主线程调用 [NStableView tableView:objectValueForTableColumn:row:],索引不再有效。 4) 调用 [tableView reloadData]。
    • 对,所以避免这个问题。您的数据源可能有两个数组,currentData 和incomingData。响应表格视图时始终使用 currentData。一旦incomingData 完成,将其分配给currentData 并告诉表重新加载。分配和重新加载调用之间没有“中间”,因此表格视图保持一致。
    【解决方案2】:

    非常感谢 cmets 中的 Graham Perks 提供了一个答案。这实际上是一个值得明确写出的答案。我只想从我的项目中添加小的 sn-p 作为插图:

    - (void) populateTable
    {
        DAL *dal = [[DAL alloc] init];  // MySQL engine
        NSMutableArray *tmp = [NSMutableArray new];
        NSMutableArray *records = [dal RetrieveRecordswithSql:@"select id, serial, scannerid, scans, offloaded, uploaded from scan_set_v3" withColumnsCount:@(6) andColumnsDelimiter:ScanSetRecordColumnDelimiter];
        for (NSString *rec in records) {
            ScanSetRecord *newRec = [[ScanSetRecord alloc] initWithScanSet:rec];
            if (newRec) {
                [tmp addObject:newRec];
            }
        }
        self.dataArray = tmp;
        [self.tableView reloadData];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2023-03-18
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多