Сбои при использовании 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, который я сейчас использую, вероятно, больше подходит для сеанса интерактивной фильтрации изображений, когда данные редактирования изображений используются с пользовательским интерфейсом, а служба, управляющая ими, поддерживает открытый сеанс с приложением.