CGContext在线程中无法正常工作

时间:2012-09-19 10:52:34

标签: ios thread-safety core-graphics drawrect cgcontext

我正在尝试使用Core Graphics从另一个线程在自定义UIView中进行无限绘制。获取当前CGContext是不可能的,所以我尝试创建一个新的CG_INLINE CGContextRef CGContextCreate(CGSize size) { CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(nil, size.width, size.height, 8, size.width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGImageAlphaPremultipliedLast); CGColorSpaceRelease(space); return ctx; } - (void)drawRect:(CGRect)rect { CGContextRef context = CGContextCreate(self.bounds.size); if(context) { [self.layer renderInContext:context]; [self drawSymbolsInContext:context]; CGContextRelease(context); } } - (void)drawSymbolsInContext:(CGContextRef)context { for (int x = 0; x<[cellsArray count];x++) { for(int y=0; y<[[cellsArray objectAtIndex:x] count]; y++) { NSLog(@"lol %d", y); float white[] = {1.0, 1.0, 1.0, 1.0}; CGContextSetFillColor(context, white); CGContextFillRect(context, [self bounds]); CGContextSetTextDrawingMode(context, kCGTextStroke); CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); CGContextSelectFont(context, "Times", 12.0, kCGEncodingMacRoman); CGAffineTransform xform = CGAffineTransformMake( 1.0, 0.0, 0.0, -1.0, 0.0, 0.0); CGContextSetTextMatrix(context, xform); CGContextShowTextAtPoint(context, 100.0, 100.0 + 15*y, "test", strlen("test")); } } } 。但我不知道如何将它应用到视图中。

以下是我在自定义视图中使用的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [NSThread detachNewThreadSelector:@selector(SomeAction:) toTarget:self withObject:self.view];
}

- (void) SomeAction:(id)anObject
{
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];
    DrawView *drawView = (DrawView *)anObject;

    while (1)
    {
        COLOR col;
        col.blue = 100;
        col.red = 100;
        col.green = 200;

        int cellX = 0;
        int cellY = [[rowsArray objectAtIndex:0] count];

        CELL cel;
        cel.x = cellX;
        cel.x = cellY;

        SymbolAlive *s = [[SymbolAlive alloc] initWithColor:col andFrame:cel];

        [[rowsArray objectAtIndex:0] addObject:s];
        [drawView drawRect:drawView.bounds];

        [NSThread sleepForTimeInterval: 0.1];
    }
    [NSThread exit];
    [autoreleasepool release];
}

以下是我用来运行thead的代码(在ViewController中):

{{1}}

循环正确运行。但屏幕上没有显示任何内容。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我猜你必须在主线程上进行绘图。而不是

    [drawView drawRect:drawView.bounds];

这样做

   [self performSelectorOnMainThread:@selector(doDraw:) withObject:nil waitUntilDone:NO];

然后创建一个类似

的绘图函数
    - (void)doDraw:(id)notused
    {
        [drawView drawRect:drawView.bounds];
    }

这将允许您在后台进行处理,但在主线程上进行绘制。

此外,在这种情况下,您应该使用标准图形上下文。

还有一条评论,您可以将所有绘图进入后台线程,然后在主线程上调用renderInContext。