(iPhone)如何从后台线程创建的imageRef创建UIImage?

4

UIImage* img = [UIImage imageWithCGImage: imageRef];
该操作只能在主线程中执行。

现在,我需要修改所有在后台线程中运行的图像创建函数。
问题是如何更改上述代码。

通常创建图像的步骤如下。

CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage* img = [UIImage imageWithCGImage: imageRef];
CGImageRelease(imageRef);

CGContextRelease(context);

return img;

如果performSelector返回一个值,那么这将非常容易。
但实际上并不是这样的。由于这似乎是一个相当普遍的需求,我想知道有没有更好的做法来实现这一点。
谢谢。
1个回答

4

UIImage* img = [UIImage imageWithCGImage: imageRef]; 只能在主线程中完成.. 哎..

仅适用于目标设备为iOS 3.x。从iOS 4开始,UIImage已经变得线程安全。如果您需要在iOS 3上运行,则典型的行为是将CGImageRef传回主线程,并在那里运行imageWithCGImage方法。


嗯,你能告诉我如何“将CGImageRef传回主线程”,以便“它可以运行imageWithCGImage”吗?这就是问题所在。因为执行此操作的策略似乎相当笨拙。 - eugene
1
好的,你可以使用 performSelector:performSelectorOnMainThread:@selector(loadImage:) withObject:(id)imageRef waitUntilDone:NO。需要注意的唯一事项是(id)强制类型转换。不确定为什么需要 performSelector 返回一个值,但是您可以使用 waitUntilDone 来有效地获取选择器完成的确认。如果需要执行更复杂的操作,您始终可以使用 NSInvocation - lxt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接