NSOperationQueue操纵NSTableView数据源使用的NSMutableArray

时间:2014-03-19 14:59:03

标签: objective-c multithreading macos nsoperationqueue

我有一个NSOperationQueue,其操作不断在后台操作实例变量myMutableArray(添加和删除元素)。 maxConcurrentOperationCount设置为1,因此不应该有多个操作同时操作数组。

myMutableArray也用于NSTableView的数据源方法。在完成对[tableView reloadData]的操作后,每个人NSOperation都会在主线程上调用myMutableArray

现在我的问题:偶尔,我得到以下异常:

-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array

来自tableView:objectValueForTableColumn:row:

我不明白为什么当我一次运行一个操作时会发生这种情况。我该怎么做才能防止它发生?

2 个答案:

答案 0 :(得分:1)

主线程和后台线程仍在同时运行。当您致电reloadData时,表格视图的重新加载也不同步。因此,在某个时间点,当数组中有一个项目时,您会请求重新加载,但是在正在进行的行计数和请求的行单元格之间,该项目将从数组中删除。

理想情况下,两个线程都不应编辑同一个数组。后台线程应该获取数组的副本并进行编辑。编辑完成后,后台线程应该将整个新阵列推回到主线程并等待该方法完成

创建一个新方法,允许更新数组,并在保存新数组后重新加载表。用以下方法调用该方法:

[... performSelectorOnMainThread:... withObject:... waitUntilDone:YES];

答案 1 :(得分:1)

您可以在@synchronize指令中包装任何操作数据结构的代码,以确保一次只能访问一个线程。