在ios tableview中,为什么section是NSIndexSet?

时间:2014-10-12 02:16:20

标签: ios objective-c uitableview nsindexset

我是iOS开发的新手,所以这个问题非常愚蠢,但我确实很难弄清楚以下代码是如何工作的:

-(void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type{  

  if (type==NSFetchedResultsChangeDelete) {
       [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationAutomatic];
   }
}

为什么NSIndexSet代表此处的部分?另外,在这个例子中,sectionIndex只是一个数字,是否只有一个数字的NSIndexSet集合?如果它只有一个数字,为​​什么不用int代表它呢?

感谢。

2 个答案:

答案 0 :(得分:5)

首先,NSIndexSet是什么。 NSIndexSet是一种非常有效的表达唯一整数集合的方法,其中许多整数可能是连续的。

假设您要表达[1,2,3,4,5,10,11,12,13,14,15]。这可以用[{1,5},{10,6}]表达得更紧密,其中表示法意味着传达两个范围,即如果你把NSMakeRange(1,5)和{{{{}}组合在一起的话。 1}}。

他们本来可以要求一个NSNumber数组,但是作为一个NSIndexSet来保证每个条目的唯一性(它是 set )并且可以提高存储和计算的效率。

(他们可能要求一个Int数组,因为你不能把一个Int放到一个NSArray中;它必须是一个对象。再次,这增加了NSIndexSet的效率 - 没有必要打开所有这些NSNumber!一组NSNumber将是一种非常低效的方式来传达这些信息。)

现在针对您的特定问题:它只能是一个数字!请注意名称:NSMakeRange(10,6)。最后看到“s”?您可以在一个命令中删除多个部分。在这种情况下,发生只删除一个部分的事实就在这一点上。而且没有效率损失。

答案 1 :(得分:0)

NSIndexSet是唯一的无符号整数的不可变集合,其优化用于将索引存储到数据结构。方法deleteSections:将NSIndexSet作为其参数,因为它允许程序员传递一组索引以进行删除。在这种情况下,您只想删除一行,因此只传递一个NSIndexSet。

更多信息:NSIndexSet documentationdeleteSections: method documentation