是从后台任务调用-setNeedsDisplay请求麻烦?

mah*_*udz 3 iphone cocoa-touch

我有一个更新视图的后台任务.该任务调用-setNeedsDisplay来绘制视图.

这有效:

- (void) drawChangesTask;
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if (pixels) {
        drawChanges((UInt32 *) origPixels, (UInt32 *) pixels, CGBitmapContextGetBytesPerRow(ctx)/4, CGBitmapContextGetHeight(ctx), count--);

        if (count < 0) {
            count = 150;
        }
        else
            [self performSelectorInBackground:@selector(drawChangesTask) withObject:nil ];

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

    }
    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

这不起作用:

- (void) drawChangesTask;
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if (pixels) {
        drawChanges((UInt32 *) origPixels, (UInt32 *) pixels, CGBitmapContextGetBytesPerRow(ctx)/4, CGBitmapContextGetHeight(ctx), count--);

        if (count < 0) {
            count = 150;
        }
        else
            [self performSelectorInBackground:@selector(drawChangesTask) withObject:nil ];

        [self setNeedsDisplay];

    }
    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

谁知道为什么?当我说它不起作用时,我的意思是它运行了数十次迭代,有时候我看到我的图像部分向上或向下移动,或者完全空白,然后欺骗者EXC_BAD_ACCESS在CoreGraphics的某个地方给我一个" ".

此外,如果我自己不处理自动释放池,那么我会收到泄漏的错误消息.不明白为什么会这样.我的drawChanges()不会创建任何新对象.这是错误:

2009-08-17 11:41:42.358 BlurApp[23974:1b30f] *** _NSAutoreleaseNoPool(): Object 0xd78270 of class NSThread autoreleased with no pool in place - just leaking
Run Code Online (Sandbox Code Playgroud)

iKe*_*dac 8

UIKit 简单地说不是线程安全的 - 你需要调用在主线程上更新UIKit控件的方法.

我认为这一行:

[self performSelectorInBackground:@selector(drawChangesTask) withObject:nil];
Run Code Online (Sandbox Code Playgroud)

造成麻烦.您是否尝试过在当前线程上再次调用它?如果您需要在调用之间执行runloop,请使用:

[self performSelector:@selector(drawChangesTask) withObject:nil afterDelay:0.0];
Run Code Online (Sandbox Code Playgroud)

这将在您进入的方法完成并且runloop已经过一次后调用当前线程上的方法.