iPhone enumerateGroupsWithTypes завершающий селектор
Я использую
[assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock];
перечислять фотоальбомы.
Перечислитель действует "асинхронно", другими словами, методы возвращаются перед перечислением всех элементов.
Как я могу узнать, когда перечисление закончено?
Я заполняю NSMutableArray с группами, и будет вызывать [myTableView reloadData]
после того, как перечисление закончено.
2 ответа
Ваше перечисление даст вашему блоку группу с нулевым указателем и установит stop в значение true, когда оно пройдет последний проход. Вы можете использовать это для установки флага или вызова некоторого завершающего кода с помощью executeSelectorOnMainThread: при следующем проходе через RunLoop.
Я посмотрел на API для этого, потому что сначала подумал, что ответ будет использовать какой-то синхронный метод, чтобы сделать то же самое. Поскольку такого метода не существует, я подозреваю, что из-за некоторых деталей реализации перечислитель не знает заранее, сколько у него элементов. Плюс, это может быть медленно.
В этом случае я бы перезагрузил таблицу во время выполнения перечисления, следя за тем, чтобы не блокировать основной поток или поток перечисления. Вот что я бы попробовал:
Делаем перечисление, сохраняя новые элементы в массиве для отображения в таблице. Каждые X секунд (возможно, 0,1?) Добавляйте новые элементы в массив, используемый в качестве источника данных для таблицы, и затем перезагружайте его. Обязательно используйте executeSelectorOnMainThread: при добавлении в массив таблицы или перезагрузке ее данных. После того, как вы добавили эти элементы в массив таблицы, новый массив элементов будет добавлен в массив таблицы.
Этот подход будет выгоден для пользователя тем, что таблица немедленно начнет загружаться, даже если на самом деле загрузка всего занимает некоторое время.