我需要从UITableView
数据源填充NSSet
。显然我希望按一些标准对表格进行排序。
我可以使用NSArray
创建一个已排序的[mySet sortedArrayUsing...]
,并将其用于我的表数据源。但是我需要更强大的功能:基础NSSet
(mySet
)会随着时间的推移而发生变化,我希望UITableView
能够相应地更新(当然仍然排序)。
目前我最好的选择是将观察者附加到NSSet
,并在每次NSArray
更改时刷新UITableView
和NSSet
。它涉及相当多的代码,但效率不高。
所以我想拥有的是这样的东西,我想:
NSArray* sortedWrapperArray = [SortedWrapper wrapperFor:mySet sortUsing:sortCriteria];
当基础集发生变化时,sortedWrapperArray
会自动更新。
在Objective-C / Cocoa世界中是否存在类似或相似的内容?
答案 0 :(得分:3)
如果您的基础集合是NSSet
,则每次设置更改时,您都将被迫从头开始对其进行排序,花费O(N*Log(N))
时间进行此操作。我认为处理问题的一种更有效的方法是将NSSet
替换为NSMutableArray
,并通过插入对其进行排序。添加和删除已排序数组中的元素仍为O(N)
:虽然您可以使用二分查找找到位置(请参阅indexOfObject:inSortedRange:options:usingComparator:
方法),但插入/删除通常为O(N)
(带有虽然非常低的常数。维护集合的唯一性属性也很容易:如果二进制搜索找到您要插入的相同元素,则只需跳过插入即可。相同值检查需要O(Log(N))
答案 1 :(得分:1)
如果您的应用仅在iOS 5.0或更高版本上运行,则可以使用NSOrderedSet