我是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
代表它呢?
感谢。
答案 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 documentation,deleteSections: method documentation。