从数据源刷新 UITableView 数据的干净方法
Posted
技术标签:
【中文标题】从数据源刷新 UITableView 数据的干净方法【英文标题】:Clean approach for refreshing UITableView data from datasource 【发布时间】:2013-07-17 14:51:12 【问题描述】:与question 有点相关。所以,我有两个 NSMutableDictionaries。 DictA 是原始数据,而 DictB 将是 UITableVIew 从中获取数据的数据。如果用户过滤某些东西,我可以删除 DictB 中不应该显示的所有对象,然后调用 [table reloadData] 并且效果很好,如下实现:
NSMutableDictionary filterSelection = [DictA objectForKey:what the user picked];
[dictB removeAllObjects];
dictB = filterSelection;
[table reloadData];
这将使 UITableView 仅显示用户过滤的内容。
问题从这里开始:
如何将所有数据“刷新”回 DictB 以便用户做出新的选择?即 DictB = DictA (显然由于引用类型而不起作用,只需将其放在那里以表明我需要将所有数据重新过滤一次)。这在任何情况下都不起作用,因为从 dictB 中删除所有对象会从 dictA 中删除所有内容,因为它们引用了内存中的相同对象。欢迎任何建议,我觉得我有正确的想法,只是在执行过程中迷失了方向。
【问题讨论】:
字典没有 objectAtIndex 方法,所以 DictA 不能是字典,它必须是数组(或可变数组)。 你说得对,我输入伪代码有点太快了。我会编辑。 【参考方案1】:你可以打电话
[dictB addEntriesFromDictionary:dictA];
这应该将所有内容从dictA
复制到dictB
。现在你可能需要在这样做之前清除dictB
,但它应该可以工作
NSMutableDictionary
像dictB = [dictA copy];
这样简单的东西也可以工作。不确定这是否有保留计数或类似问题。
【讨论】:
哇,好用,我认为它会更有效。 addEntriesFromDictionary 是否复制对象? 我不太确定是不是这样。可能不会,但只要您对对象的保留计数足够高,它就不会消失,而且由于 dictA 仍然具有对该对象的引用,尽管您可能已将其从 dictB 中删除,所以您应该没问题。 所以快速查看文档,似乎字典的键被复制到新字典中,但对象本身不是,它只是被告知增加保留计数。 addEntriesFromDictionary 太棒了,我很感激【参考方案2】:我不太确定您的数据模型是如何设置的,但一般来说,内存中不需要有两个指向同一个对象的指针。例如:
dictB = dictA;
以上只是创建了一个引用,可能就是你正在做的事情。
dictB = [NSMutableDictionary dictionaryWithDictionary:dictA];
这会创建一个数据副本,您可以将其与原始对象分开管理。
还有很多其他方法可以解决这个问题,我建议您查看NSDictionary
和NSMutableDictionary
的文档以了解其他可能性。
【讨论】:
以上是关于从数据源刷新 UITableView 数据的干净方法的主要内容,如果未能解决你的问题,请参考以下文章