我有一个NSOperationQueue
,其操作不断在后台操作实例变量myMutableArray
(添加和删除元素)。 maxConcurrentOperationCount
设置为1
,因此不应该有多个操作同时操作数组。
myMutableArray
也用于NSTableView
的数据源方法。在完成对[tableView reloadData]
的操作后,每个人NSOperation
都会在主线程上调用myMutableArray
。
现在我的问题:偶尔,我得到以下异常:
-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array
来自tableView:objectValueForTableColumn:row:
。
我不明白为什么当我一次运行一个操作时会发生这种情况。我该怎么做才能防止它发生?
答案 0 :(得分:1)
主线程和后台线程仍在同时运行。当您致电reloadData
时,表格视图的重新加载也不同步。因此,在某个时间点,当数组中有一个项目时,您会请求重新加载,但是在正在进行的行计数和请求的行单元格之间,该项目将从数组中删除。
理想情况下,两个线程都不应编辑同一个数组。后台线程应该获取数组的副本并进行编辑。编辑完成后,后台线程应该将整个新阵列推回到主线程并等待该方法完成。
创建一个新方法,允许更新数组,并在保存新数组后重新加载表。用以下方法调用该方法:
[... performSelectorOnMainThread:... withObject:... waitUntilDone:YES];
答案 1 :(得分:1)
您可以在@synchronize指令中包装任何操作数据结构的代码,以确保一次只能访问一个线程。