我之前从未意识到这种二分法,所以我需要问你。 让我们说我们有一些模型管理器类,它将通过公共属性公开NSArray对象。这是我们的模型。 现在我还有一个视图控制器,在tableview单元格中显示该数组的成员。 我将此NSArray设置为tableview的数据源。但是,如果我希望我的模型及时改变数据呢?
我有两个选择。 1)使数组可变。 2)将实例NSArray替换为包含新数据的不同实例。
选项1的问题是任何人都可以更改数组的内容,这似乎是错误的。 选项2的问题是tableViewController会愉快地指向原始数组实例并忽略管理器类现在指向一个新实例(因为它用一个具有更新数据的实例替换了它的属性数组实例)。
总结一下,我想要一个只能从模型管理器中变异的数组实例,但是对外界来说是不可变的。哪个不可能吧? 任何想法如何解决这个问题?
答案 0 :(得分:2)
管理数组的对象也应该是表视图的数据源,或者表视图的数据源应始终确保在表视图重新加载其数据之前从管理数组的对象获取数组的新副本。
无论哪种方式,表视图的数据源正在使用的数组最终应该是一个不可变数组,并且每次更改此数组时,都应立即调用reloadData
。
这将防止在显示数据的表视图中间修改数组中的数据。例如,如果在调用numberOfRowsInSection:
之后数组的内容发生变化,则会出现问题。