Преобразование между уникальным NSIndexPath и уникальным NSUInteger (или int)

StackOverflow https://stackoverflow.com/questions/1849669

Вопрос

Есть ли лучший способ, чем тот, который есть предложено здесь чтобы создать взаимно однозначное сопоставление между ячейками табличного представления NSIndexPath и уникальный NSUInteger или int, чтобы создать уникальный tag значение свойства виджета в ячейке ( UIProgressView)?

Ссылка добавляет методы через UIKit расширение категории, которое преобразует между NSIndexPath и int, но они работают только для меньшего количества строк.

Конечно, я, возможно, не упираюсь в этот предел, но мне интересно, есть ли какое-то сопоставление, которое кто-то придумал, и которое может гарантированно работать для любого количества строк.

Это было полезно?

Решение

Нет, на самом деле не существует способа, который гарантированно будет работать для любого количества строк.Если у вас есть таблица с двумя разделами, каждый из которых содержит 3 миллиарда строк, то невозможно сопоставить эти 6 миллиардов потенциальных NSIndexPath с 4 миллиардами 32-битных NSIntegers.

(Если бы вы создавали 64-битное приложение, то было бы то же самое, но в этом примере цифры должны были бы быть еще в 4 миллиарда раз больше.)

В примере, на который вы ссылаетесь, они используют ограничение в 10 000 строк на раздел;если вы серьезно обеспокоены тем, что у вас может быть больше строк, вы можете использовать большую константу, т.е.вы можете использовать 1 000 000 в качестве максимального количества строк, если знаете, что у вас не будет более 4 000 разделов.

Обратите внимание, что «настоящий программист», предположительно, будет использовать в качестве константы 65536.

Другие советы

Если бы мне пришлось это сделать, я бы просто сместил путь раздела на одну половину 32-битного целого числа, а часть строки — на другую.Да, это означает, что вы не можете иметь более 65535 элементов подряд (при разбиении я предполагал беззнаковые целые числа, поскольку строка/раздел никогда не будет отрицательным), но я возьму предполагаемый предел, намного больший, чем мне когда-либо понадобится, более волшебная константа в любой день.

Плюс это дешевле в вычислительном отношении.

Обычно в этой ситуации я настраиваю свой контроллер табличного представления в качестве делегата для каждой ячейки, и ячейка может вызывать контроллер с любыми изменениями вместе с некоторым значением ключа, используемым для создания ячейки - в конце концов, когда вы заполняете ячейку, вы знать, как получить доступ к вашему набору данных, чтобы извлечь значения.Черт возьми, вы могли бы даже просто сохранить IndexPath в ячейке, и она сможет перезвонить с этим.Причина, по которой я бы не стал использовать подход IndexPath или предыдущий подход, включающий сведение NSIndexPath в тег, заключается в том, что если вы когда-нибудь начнете динамически изменять строки, значения могут стать невыровненными между NSndexPath, с помощью которого вы создали ячейку, и значением для текущего набора данных.Гораздо лучше иметь какой-то ключ, который всегда логически вернет вас к нужным данным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top