1

我是 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只有一个数字的集合?如果它只有一个数字,为​​什么不直接用 aint来表示呢?

谢谢。

4

2 回答 2

5

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

假设您要表达[1,2,3,4,5,10,11,12,13,14,15]. 这可以更紧密地表示为[{1,5},{10,6}],该符号旨在传达两个范围,即如果将 和 放在一起NSMakeRange(1,5),您会得到什么NSMakeRange(10,6)

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

(他们不可能要求Int 数组,因为您不能将 Int 放入 NSArray;它必须是一个对象。同样,这增加了 NSIndexSet 的效率 - 无需解开所有这些 NSNumber ! NSNumber 数组将是一种非常低效的方式来传达此信息。)

现在针对您的特定问题:它不必只有一个数字!注意名称:deleteSections:. 看到最后的“s”了吗?您可以在一个命令中删除多个部分。在这种情况下,您碰巧只删除了一个部分,这一事实是无关紧要的。并且不会因此而损失效率。

于 2014-10-12T02:32:19.500 回答
0

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

更多信息:NSIndexSet 文档deleteSections:方法文档

于 2014-10-12T02:26:44.333 回答