iPhone enumerateGroupsWithTypes завершающий селектор

Я использую

[assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock];

перечислять фотоальбомы.

Перечислитель действует "асинхронно", другими словами, методы возвращаются перед перечислением всех элементов.

Как я могу узнать, когда перечисление закончено?

Я заполняю NSMutableArray с группами, и будет вызывать [myTableView reloadData] после того, как перечисление закончено.

2 ответа

Решение

Ваше перечисление даст вашему блоку группу с нулевым указателем и установит stop в значение true, когда оно пройдет последний проход. Вы можете использовать это для установки флага или вызова некоторого завершающего кода с помощью executeSelectorOnMainThread: при следующем проходе через RunLoop.

Я посмотрел на API для этого, потому что сначала подумал, что ответ будет использовать какой-то синхронный метод, чтобы сделать то же самое. Поскольку такого метода не существует, я подозреваю, что из-за некоторых деталей реализации перечислитель не знает заранее, сколько у него элементов. Плюс, это может быть медленно.

В этом случае я бы перезагрузил таблицу во время выполнения перечисления, следя за тем, чтобы не блокировать основной поток или поток перечисления. Вот что я бы попробовал:

Делаем перечисление, сохраняя новые элементы в массиве для отображения в таблице. Каждые X секунд (возможно, 0,1?) Добавляйте новые элементы в массив, используемый в качестве источника данных для таблицы, и затем перезагружайте его. Обязательно используйте executeSelectorOnMainThread: при добавлении в массив таблицы или перезагрузке ее данных. После того, как вы добавили эти элементы в массив таблицы, новый массив элементов будет добавлен в массив таблицы.

Этот подход будет выгоден для пользователя тем, что таблица немедленно начнет загружаться, даже если на самом деле загрузка всего занимает некоторое время.

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