我有两个后台线程同时运行。 第一个线程是将原始像素数据转换为UIImage(使用CGImageCreate),并使用UIImageJPEGRepresentation将此图像保存为JPEG。 第二个线程从文件中读取JPEG数据并将其加载到UIImage中。然后从该UIImage中提取原始像素数据(使用CGBitmapContextCreate)。
问题是线程写入的偶尔(50个中的1个)JPEG数据已损坏:
损坏的图像通常具有纯色的顶部/底部字段。
如果我使用互斥锁来防止整个后台方法同时运行,问题就会消失。我也试过使用libjpeg代替UIKit方法,它也可以正常工作。
我很确定我的线程永远不会同时访问相同的图像数据。 据我所知,一些UIKit方法是线程安全的。但在这种情况下查看某些东西不是线程安全的。
我的问题是在一个线程上将原始像素数据保存为JPEG的正确方法是什么,而将JPEG解码为另一个线程上的原始像素数据?我还需要在主线程上同时使用UIImage进行绘图。
答案 0 :(得分:1)
原来问题是我在创建CGImage后删除了传递给CGDataProviderCreateWithData
的像素数据。
只有在调用回调CGDataProviderReleaseDataCallback
后才能销毁数据。