为什么我不能使用NSOperationQueue / NSOperationInvocation更新我的UIScrollView的内容?

时间:2011-12-09 01:32:41

标签: uiview uiscrollview uibutton uiimage nsoperationqueue

我想我记得有关在主线程上更新UI的一些内容,可能是解释,但我的问题是我有一个UIScrollView,里面有1000多个图像,我写了一个例程,可以快速切换图像在视图中显示其真实图像,当超出可见视图时,它们切换到占位符图像。所有屏幕外图像共享相同的占位符,大大减少了内存负载。

我编写了两种方法来打开/关闭视图的下几个图块,如果你在某个方向上滚动得足够的话,就会被踢掉。通过UIScrollViewDelegate回调方法scrollViewDidScroll检测滚动。

此策略运行正常,但滚动视图滚动在慢速设备(iPad 1)上有点紧张。我想提高性能,所以我想我可以更改代码,以便更新scrollview内容的两个方法是NSOperationInvocation,添加到NSOperationQueue。

然而,当我这样做时,即使优先级设置为VeryHigh,即使它们似乎被调用也不会更新UI的例程,并且当滚动时队列确实增长。观察到的行为是图像保留其占位符图像并且不会打开。

为什么这不起作用?

NSOperationInvocation的代码:

    ImageThumbView *thumb = [boardThumbsArray objectAtIndex:lowestLoadedThumbTag - i];
    [loadedThumbsArray addObject:thumb];
    [thumb showThumbImage];

ImageThumbView是一个UIButton子类

    - (void)showThumbImage {

if (thumbImagePath != nil) {
    thumbImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL fileURLWithPath:thumbImagePath]]];
} else {
    NSLog(@"%@", @"Cannot show thumb image: thumbImagePath is nil");
}

[self setBackgroundImage:thumbImage forState:UIControlStateNormal];
[self setNeedsDisplay];

}

1 个答案:

答案 0 :(得分:0)

查看Apple的“PhotoScroller”示例代码。您不应该有1000个视图作为scrollview的子视图。回收那些不再可见的。

另请参阅WWDC 2010“使用scrollview设计应用程序”视频。这解释了photoscroller示例代码

由于