Передача данных изображения из UIImagePickerController для фоновой обработки - PullRequest
2 голосов
/ 21 марта 2011

Я использую UIImagePickerController для захвата неподвижного изображения. Затем мне нужно выполнить некоторую обработку, прежде чем сохранять разные копии изображения в хранилище Core Data. На iPhone 4 обработка и сохранение могут занимать до 4-8 секунд, поэтому я пытаюсь перевести работу в фоновую очередь, чтобы не блокировать все приложение и пользовательский интерфейс.

В корне моего вопроса это. Можно ли использовать UIImage в фоновом потоке, если объект UIImage полностью ограничен этим потоком? Я нашел следующее в сводке безопасности потока Apple о NSImage. Я предполагаю, что UIImage будет работать так же.

NSImage Ограничения:

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

Может ли кто-нибудь подтвердить это, или это просто неправильно - прикасаться к чему-то вроде объекта UIImage вне основного потока. Если использование ограниченного экземпляра UIImage в порядке, то это приводит к другой проблеме. UIImagePickerController возвращает NSDictionary, который является потокобезопасным, но внутри этого NSDictionary является объектом UIImage. Безопасно ли передавать этот словарь другому потоку, а затем использовать содержащийся в нем объект?

Если UIImage в информационном словаре imagePicker небезопасно использовать, то какие-либо предложения о том, как лучше поступить?

Я думаю, что у меня есть реальные проблемы с многопоточностью Core Data. Но для информации я в настоящее время пишу и извлекаю данные изображения, используя NSValueTransformer для преобразования UIImage в и из NSData в пользовательском подклассе NSManagedObject.

1 Ответ

0 голосов
/ 21 марта 2011

Я работал над некоторым кодом «Обработка изображения после UIImagePickerController» в фоновом потоке, так же, как вы, и у меня не было проблем. Ниже приведены шаги, с которыми я добился успеха.

  1. Делегат средства выбора изображений возвращает изображение пользователя.
  2. Присвойте изображение классу фонового потока (в моем случае это был @property retain'ed IVAR)
  3. закрыть / закрыть Image Picker
  4. Фоновая обработка продолжается и создает новый UIImage после манипулирования исходным
  5. новый UIImage возвращается в соответствующий VC
  6. Фоновый процесс заканчивается.
...