iOS4和后台[UIImage setImage:]

Dam*_*bin 8 multithreading uiimage ios4

直到iOS 3.2,我使用这种代码UIImageView在后台加载图像,它工作得很好......

码:

- (void)decodeImageName:(NSString *)name
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    UIImage *newImage = [UIImage imageNamed:name];
    [myImageView setImage:newImage];
    [pool release];
}
...
[self performSelectorInBackground:@selector(decodeImageName:) withObject:@"ID"]
Run Code Online (Sandbox Code Playgroud)

......即使[UIImageView setImage:]不是线程安全的!

但是从iOS 4开始,它不再起作用......图像在setImage通话两秒后出现在屏幕上.如果我做了一个[myImageView performSelectorOnMainThread:@selector(setImage:) withObject:newImage waitUntilDone:YES]而不是[myImageView setImage:newImage],图像立即显示,但似乎是在运行中再次重新解码(忽略之前[UIImage imageNamed:]应该已经解码图像数据),导致我的主线程暂停...即使文档说明底层图像缓存在所有线程之间共享..

任何想法 ?

Jaa*_*nus 3

performSelectorInBackground:在后台线程中运行选择器。然而 setImage: 是一个 UI 函数。UI 函数只能在主线程上运行。我没有深入了解这个特定的问题,但这是对该代码的第一感觉,可能是 iOS4 以某种方式以不同的方式处理在后台线程中运行 UI 函数的(不支持的)机制。