Сбои при использовании CIDetector и других Core Image API в фоновых потоках

Я удалил свой последний вопрос по этой теме, чтобы продолжить изучение проблемы.

Я работаю над базой для поиска изображений на основе контента, которая индексирует локальный фотоальбом на iPhone. Я написал фильтры и методы для извлечения объектов, но в качестве шага предварительной обработки я использую CIDetector для обнаружения прямоугольников лица и фильтрации этих прямоугольников через локальный фильтр двоичного шаблона и извлечения гистограмм маленьких прямоугольников.

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

Проблема в том, что единственный способ получить доступ к изображениям в фотоальбоме - это использование PHAsset. Есть два API, которые обычно используются с ним, оба из которых требуют блоков обратного вызова. Один из них получает представление UIImage, это не то, что мне нужно, в первую очередь потому, что мне нужно будет загрузить многие из них, и ограничения памяти жесткие, и я не собираюсь показывать изображение вообще. Он также возвращает словарь объектов, один из которых является URL-адресом самого файла изображения, но с использованием +[CIImage imageWithContentsOfURL] вернет ноль и консоль iOS покажет, что при использовании этого API в изображении отказано в разрешении.

Другой -[PHAsset requestContentEditingInputWithOptions], Этот конкретный API будет принудительно вызывать блок обратного вызова в основной очереди, независимо от того, какая очередь назвала API, блок обратного вызова всегда отправляется в основную очередь. Используя этот API, CIImage может быть успешно загружен с помощью +[CIImage imageWithContentsOfURL]Это означает, что API фактически дал разрешение на доступ к файлу. Затем я могу поместить CIImage в другую очередь, которая будет выполнять все этапы обработки индекса.

Этот подход, кажется, работает, но только на короткое время. В конце концов приложение вылетает, и все, что я вижу, это то, что во время более ранней обработки появляется сообщение, которое говорит Connection to assetsd was interrupted or assetsd died,

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

Редактировать: мне приходит в голову, что я, вероятно, неправильно использую этот API, но оказалось, что это единственное, что дало бы мне нужные данные в соответствующем формате (CIImage, который можно использовать для загрузки данных пикселей из файла, когда необходимо, во время обработки).

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

0 ответов

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