В ios tableview, почему раздел является 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 ответа
Во-первых, что такое 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 - нет необходимости развертывать все эти NSNumbers! Массив NSNumber был бы очень неэффективным способом передачи этой информации.)
Теперь для вашего конкретного вопроса: это не должен быть только один номер! Обратите внимание на название: deleteSections:
, Видите букву "с" в конце? Вы можете удалить несколько разделов в одной команде. Тот факт, что в этом случае вы удаляете только один раздел, не имеет значения. И никакая эффективность не теряется при этом.
NSIndexSet - это неизменяемая коллекция уникальных целых чисел без знака, оптимизированных для хранения индексов в структурах данных. Метод deleteSections:
принимает NSIndexSet в качестве своего параметра, потому что он позволяет программисту передавать набор индексов для удаления. В этом случае вы хотите удалить только одну строку, поэтому вы передаете NSIndexSet только с одним членом.
Дополнительная информация: документация NSIndexSet, deleteSections: документация метода.