Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我可以从多个线程绘制到同一个CGContextRef吗?_Ios_Objective C_Cocoa_Swift_Core Graphics - Fatal编程技术网

Ios 我可以从多个线程绘制到同一个CGContextRef吗?

Ios 我可以从多个线程绘制到同一个CGContextRef吗?,ios,objective-c,cocoa,swift,core-graphics,Ios,Objective C,Cocoa,Swift,Core Graphics,我正在制作一个应用程序,我想画很多形状——圆、盒子、线等等。 数以百万计 为了测试它的性能,我创建了这个简单的UIView。请注意,功劳是应得的-我受到了启发 这个很好用。在我的iOS模拟器上,一分钟多一点就能画出一百万个圆圈 我想加快速度,所以我尝试从多个线程绘制到位图上下文 let group = dispatch_group_create() for i in 1...100 { dispatch_async(dispatch_get_global_queue(QOS_CLASS_

我正在制作一个应用程序,我想画很多形状——圆、盒子、线等等。 数以百万计

为了测试它的性能,我创建了这个简单的UIView。请注意,功劳是应得的-我受到了启发

这个很好用。在我的iOS模拟器上,一分钟多一点就能画出一百万个圆圈

我想加快速度,所以我尝试从多个线程绘制到位图上下文

let group = dispatch_group_create()
for i in 1...100 {
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
        dispatch_group_enter(group)

        CGContextFillEllipseInRect(context, bounds)

        dispatch_group_leave(group)
    }
}

dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
然而,这并不奏效。调用
CGContextFillEllipseInRect(context,bounds)
时,我获得了一个
EXC\u BAD\u访问权限

在后台线程中绘制到
CGContext
,只要它是创建它的同一线程就可以了

有人知道如何使其工作吗?

1)您实际上并不是在等待创建的组完成--
dispatch\u group\u wait
将在执行任何块之前在该代码中调用,因此其中的enter/leave调用不会产生任何效果。改用
dispatch\u group\u async
(见下文)

2) 不能同时从两个不同的线程绘制到
CGContext
——如果在绘图循环中添加println,可以看到这一点。它会工作几次,结果也会有所不同,但最终会出现错误

let group = dispatch_group_create()
for i in 1...10 {
    dispatch_group_async(group, dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) {
        for j in 1...100 {
            println("i:\(i), j:\(j)")
            CGContextFillEllipseInRect(context, bounds)
        }
    }
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
样本输出:

iiii::::4123,,,,    jjjj::::1111



ii:1, j:2
:5, j:1
i:6, j:1
EXC_BAD_ACCESS

唯一的解决办法是跳回一个线程进行绘图,但这会以任何方式挫败您试图做的事情。如果您必须进行大量计算以决定要绘制的内容,这可能会发生在不同的线程上,但是绘制到
CGContext
本身并不是线程安全的。

如果不重用
上下文
引用,会发生什么情况,但是获取当前位图上下文?获取位图上下文的唯一方法是在创建新图像上下文后调用UIGraphicsGetCurrentContext。否则,UIGraphicsGetCurrentContext将获得另一个上下文。我想使用多个磁芯的最好方法是画“桶”,也就是说,将完整图像的各个部分分开,然后将它们缝合在一起。
iiii::::4123,,,,    jjjj::::1111



ii:1, j:2
:5, j:1
i:6, j:1
EXC_BAD_ACCESS