gpt4 book ai didi

iphone - 从后台任务调用 -setNeedsDisplay 是否会带来麻烦?

转载 作者:行者123 更新时间:2023-12-03 19:31:47 26 4
gpt4 key购买 nike

我有一个更新 View 的后台任务。该任务调用 -setNeedsDisplay 来绘制 View 。

这有效:

- (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];
}

这不起作用:

- (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];
}

有人知道为什么吗?当我说它不起作用时,我的意思是它运行了数十次迭代,有时我看到图像的一部分向上或向下移动,或者完全空白,然后调试器给我一个“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

最佳答案

UIKit 根本就不是线程安全的 — 您需要调用在主线程上更新 UIKit 控件的方法。

我认为这一行:

[self performSelectorInBackground:@selector(drawChangesTask) withObject:nil];

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

[self performSelector:@selector(drawChangesTask) withObject:nil afterDelay:0.0];

这将在您所在的方法完成并且运行循环运行一次后调用当前线程上的方法。

关于iphone - 从后台任务调用 -setNeedsDisplay 是否会带来麻烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1290228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com