- (NSArray *)dataSourceForIndividuals:(NSArray *)individuals {
// Assumption: displayNames are sorted alphabetically
NSUInteger sectionIndexTitlesCount = [[self sectionIndexTitles] count];
NSMutableArray *dataSource = [NSMutableArray arrayWithCapacity:sectionIndexTitlesCount];
NSUInteger index = 0;
for (index = 0; index < sectionIndexTitlesCount; index++) {
[dataSource addObject:[NSMutableArray array]];
}
SEL selector = @selector(displayName);
index = 0;
for (TDTIndividual *individual in individuals) {
NSInteger sectionNumber = [[UILocalizedIndexedCollation currentCollation] sectionForObject:individual collationStringSelector:selector];
[[dataSource objectAtIndex:(NSUInteger)sectionNumber] addObject:individual.objectID];
++index;
}
return dataSource;
}
上面的代码工作正常,但是如果个人数量很大,第二个for循环所花费的时间太长,有没有更好的方法呢?
答案 0 :(得分:0)
我们不了解您的数据结构或您在某些方法中使用的操作。如果你可以测量一些函数正在使用的计算时间,那将是一件好事。您可以在instruments或measure that in code中找到想法。
然而,也许你可以迭代你的[UILocalizedIndexedCollation currentCollation]
并通过它添加对象。可能比检查每个对象对应的部分更有效。
答案 1 :(得分:0)
@ Tiago-Almeida指出,我们对您的数据结构一无所知。我们也不知道“大量”个人的意思。并且他使用Instruments来查看时间进展的提示是非常有效的。
但是,我想到的是,表视图的工作原理之一就是它允许数据源延迟加载其数据。如果您拥有大量的个人,可能无法预先将它们加载到巨大的数组中。
所以你可以:
修改后备数据结构,以便每次需要表视图时都不需要迭代整个列表以将它们分类为多个部分。坦率地说,这种方法是我的第一直觉,好像我知道个人数量可能很大,我不想重复迭代整个列表。也许您可以修改您的getter / setter以自动维护这些部分数组,以便在您需要它们时它们已经存在?
异步完成部分工作。加载可管理数量的个人,创建数组的不可变副本以用作数据源(确保进行深层复制),然后在后台完成其余工作。然后定期使用新的非可变副本更新数据源并在主线程上调用refreshData。
显然,异步方法并不理想,因为表格可以“跳转”在用户身上,特别是如果他们试图立即滚动表格。但是,如果没有其他选择,并且总加载时间仍然可以管理,那么对于用户来说,这是一个更好的体验,而不仅仅是阻塞,直到整个数组被分类/加载。