Multithreading 从后台线程更新NSTableView数据源

Multithreading 从后台线程更新NSTableView数据源,multithreading,cocoa,nstableview,Multithreading,Cocoa,Nstableview,将经常从后台线程更新的数据源与GUI主线程同步的最佳方法是什么 我应该在每个方法调用周围放置pthread互斥锁吗? 这对我来说似乎也很重 编辑:我正在寻找10.5解决方案您可以随时在主线程上更新模型和表视图。NSObject中有一些函数,如performSelectorOnMainThread:withObject:waitUntilDone:,允许您轻松地在主线程上执行函数调用。因此,您可以使用以下内容更新您的模型: [model performSelectorOnMainThread:@s

将经常从后台线程更新的数据源与GUI主线程同步的最佳方法是什么

我应该在每个方法调用周围放置pthread互斥锁吗? 这对我来说似乎也很重


编辑:我正在寻找10.5解决方案

您可以随时在主线程上更新模型和表视图。NSObject中有一些函数,如
performSelectorOnMainThread:withObject:waitUntilDone:
,允许您轻松地在主线程上执行函数调用。因此,您可以使用以下内容更新您的模型:

[model performSelectorOnMainThread:@selector(addObject:) withObject:newObject waitUntilDone:YES];
然后,使用以下命令更新tableview:

[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

如果您需要传递多个对象,事情会变得更复杂,因为您需要使用调用,但我发现这些函数大部分时间都可以使用。

这是在雪豹上实现的,还是希望保持与10.2+的兼容性?如果您死心塌地地想要保持向后兼容性,那么您可以找出将更新应用到另一个方法的代码,并使用
performSelectorOnMainThread:withObject:waitUntilDone:

或者,如果您喜欢玩新玩具并使代码更具可读性(即,将方法的数量保持在最低限度),您可以在和的帮助下在线完成。类似以下内容可能就足够了:

// The following line is (presumably) executed in your background thread
NSMutableArray *newEntries = [self doSomeHeavyLiftingInBackground];
dispatch_async(dispatch_get_main_queue(), ^{
    /* The following lines are executed in the context of your main 
    thread's run loop. You don't need to mess about with locks as it
    will not be executed concurrently with UI updates. */
    id<NSTableViewDataSource> dataSource = [self getDataSource];
    NSMutableArray *dataSourceInnards = [dataSource whyIsThisMethodHere];
    [dataSourceInnards addObjectsFromArray:newEntries];
    [dataSource tellTableViewToReload];
});
//下面这行(大概)是在后台线程中执行的
NSMutableArray*newEntries=[self dosomeheavyliftingbackground];
dispatch\u async(dispatch\u get\u main\u queue()^{
/*以下几行是在主程序的上下文中执行的
线程的运行循环。你不需要在它运行时乱搞锁
不会与UI更新同时执行*/
id dataSource=[self-getDataSource];
NSMutableArray*DataSourceInArds=[dataSource whyIsThisMethodHere];
[dataSourceInnards addObjectsFromArray:newEntries];
[数据源TelltableViewStoreLoad];
});

这样做的好处是,不必将代码扭曲为pass-a-single-object-to-a-separate-method模式。

只需几秒钟就可以完成,但希望这能突出几个备选方案。:)但是我的主要想法是从主线程中获取工作负载。该模型可以有数万个列表项。当主线程阻塞10毫秒时,你也能感觉到。想必,创建要放入数组的对象将花费最多的时间,而不是将它们插入数组。如果您担心单独添加对象的主线程上的负载,可以使用addObjectsFromArray:一次批添加多个对象。否则,如果不使用GCD(如果您正在开发10.5应用程序,则不能使用GCD),则必须使用NSLock。