В 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: документация метода.

Другие вопросы по тегам