是否可以使用Quartz 2D在另一个线程上创建UIImage?

jfi*_*isk 3 quartz-2d grand-central-dispatch ios ios5

我想移动一些代码,需要几秒钟才能在另一个线程上生成UIImage,但是在使用时会出现上下文错误

    UIGraphicsBeginImageContextWithOptions(size,false,0);
Run Code Online (Sandbox Code Playgroud)

在调用调度之前,为我尝试做的每个操作生成说"无效上下文0x0"的图像.这是可能吗?

rob*_*off 13

iOS中有什么新功能:iOS 4.0说:

  • 在UIKit中绘制图形上下文现在是线程安全的.特别:
    • 用于访问和操作图形上下文的例程现在可以正确处理驻留在不同线程上的上下文.
    • 字符串和图像绘制现在是线程安全的.
    • 现在可以安全地使用多个线程中的颜色和字体对象.

听起来你尝试过这样的事情:

UIGraphicsBeginImageContextWithOptions(size,false,0);
dispatch_async(someQueue, ^{
    [UIColor.whiteColor setFill];
    UIRectFill(0, 0, 20, 20);
    dispatch_async(dispatch_get_main_queue(), ^{
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        self.imageView.image = image;
    });
};
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为每个线程都有自己的图形上下文堆栈(从iOS 4.0开始).你需要这样做:

dispatch_async(someQueue, ^{
    UIGraphicsBeginImageContextWithOptions(size,false,0);
    [UIColor.whiteColor setFill];
    UIRectFill(0, 0, 20, 20);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    dispatch_async(dispatch_get_main_queue(), ^{
        self.imageView.image = image;
    });
};
Run Code Online (Sandbox Code Playgroud)

UPDATE

文件UIGraphicsBeginImageContextWithOptions其他UIKit的图形功能和现在说

在iOS 4及更高版本中,您可以从应用程序的任何线程调用此函数.

文档UIColor

颜色对象是不可变的,因此可以安全地从应用程序中的多个线程中使用它们.

文档UIFont

字体对象是不可变的,因此可以安全地从应用程序中的多个线程中使用它们.

但是,UIKit -drawing添加的文档NSString

必须在应用程序的主线程中使用此类扩展中描述的方法.

所以你不能尝试像[@"hello" drawAtPoint:CGPointZero withAttributes:attrs]后台线程那样的东西.