Недавно мы преобразовали наш код для использования UIDocument вместо непосредственного управления файлами в файловой системе, и в результате мы столкнулись с некоторыми проблемами производительности. Нам интересно, неправильно ли мы используем этот класс, были ли у кого-то еще такие проблемы и каковы общие способы их решения.
Наше приложение
У нас есть «приложение для обуви», которое управляет кучей документов, каждый из которых состоит из нескольких файлов изображений, которые могут быть довольно тяжелыми, небольшого файла метаданных и небольшого изображения для предварительного просмотра. Пользователь может иметь много документов на своем устройстве (более 1000 документов). Файлы каждого документа сгруппированы в каталоге, и мы используем NSFileWrapper для их чтения и записи.
Когда наше приложение запускается, ему нужны метаданные всех документов, чтобы показать индекс документа и подмножество изображений для предварительного просмотра. Дополнительные изображения для предварительного просмотра загружаются по мере прокрутки пользователем.
Чтобы получить эту информацию, мы открываем все документы, читаем их метаданные и предварительно просматриваем изображение, если это необходимо, закрываем их, а затем снова открываем по требованию.
Проблема №1: Медленная загрузка
Открытие всех документов и чтение их метаданных занимает много времени. Я думаю, что есть несколько факторов, способствующих этой проблеме: - Каждое действие открытия документа выполняется относительно медленно - Блоки открытия документа и блоки завершения выполняются в одной и той же очереди, что делает задержку операции очень большой (мой документ открыт, но блок завершения должен ждать X открытых блоков документа, прежде чем он сможет запуститься)
Мы думали о решении этой проблемы с помощью отдельного индексного файла, но у этого подхода есть недостаток, заключающийся в том, что нам нужно будет управлять метаданными в двух местах и что нам нужно будет синхронизировать их с файловой системой на случай, если iCloud изменит файлы.
Проблема № 2: многопоточность
Каждый открытый документ создает свой собственный «поток доступа к файлу». Когда мы одновременно открываем много документов, накладные расходы разрушают приложение.
Мы решили эту проблему, синхронизировав открытые операции с помощью семафора. Недостаток этого подхода в том, что он еще больше замедляет загрузку.
Вопросы
- Есть ли какая-то фундаментальная проблема в том, как мы используем UIDocument? Если не:
- Кто-нибудь сталкивался с подобной проблемой времени загрузки? Каков общий способ ее решения? Сохраняют ли другие приложения индексный файл?
- Есть ли способ заставить документ пользовательского интерфейса использовать пул потоков? Если нет, то как вы контролируете использование ресурсов?
Спасибо!