从 UIImagePickerController 传递图像数据以进行后台处理
Posted
技术标签:
【中文标题】从 UIImagePickerController 传递图像数据以进行后台处理【英文标题】:Passing Image data from UIImagePickerController off for background processing 【发布时间】:2011-03-21 16:56:54 【问题描述】:我正在使用 UIImagePickerController 来捕获静止图像。然后,在将图像的不同副本保存到 Core Data 存储之前,我需要做一些处理工作。在 iPhone 4 上,处理和保存工作最多可能需要 4-8 秒,因此我尝试将工作分支到后台队列,这样整个应用程序和 UI 就不会阻塞。
我的问题的根源是这个。只要 UIImage 对象完全限制在该线程中,是否可以在后台线程中使用 UIImage ?我在apple's thread safety summary 中找到了关于 NSImage 的以下内容。我假设 UIImage 会以同样的方式工作。
NSImage 限制:
一个线程可以创建一个 NSImage 对象,绘制到图像缓冲区,然后将其传递给主线程进行绘制。底层图像缓存在所有线程之间共享。有关图像和缓存工作原理的更多信息,请参阅 Cocoa 绘图指南。
任何人都可以确认这一点,或者在主线程之外触摸 UIImage 对象之类的东西是完全错误的。如果使用受限的 UIImage 实例是可以的,那么我会导致另一个问题。 UIImagePickerController 返回一个线程安全的 NSDictionary,但在该 NSDictionary 中是一个 UIImage 对象。将该字典传递给另一个线程然后在该线程中使用包含的对象是否安全?
如果 imagePicker 信息字典中的 UIImage 使用不安全,那么有什么建议可以最好地进行吗?
我想我已经弄清楚了实际的核心数据线程问题。但是对于信息,我目前使用 NSValueTransformer 编写和检索图像数据,以便在自定义 NSManagedObject 子类中将 UIImage 与 NSData 进行转换。
【问题讨论】:
【参考方案1】:我和你一样在后台线程中处理了一些“在 UIImagePickerController 之后处理图像”代码,没有任何问题。以下是我成功的步骤。
-
Image Picker Delegate 返回用户图像。
将图像分配给后台线程类(在我的情况下,它是一个 @property 保留的 IVAR)
关闭/关闭图像选择器
后台处理继续并在处理原始 UIImage 后创建一个新的 UIImage
新的 UIImage 被返回给适当的 VC
后台进程结束。
【讨论】:
感谢您的回答。它似乎正在工作。我之前尝试过,但无法让 UIImage 通过。我可能一直在使用副本而不是保留属性。以上是关于从 UIImagePickerController 传递图像数据以进行后台处理的主要内容,如果未能解决你的问题,请参考以下文章
从 UITabBarController 驱动 UIImagePickerController
从 UIImagePickerController 保存视频
UIImagePickerController 从 UICollectionViewCell 内的 UIImageView 呈现
如何从 UIImagePickerController 获取图像文件名