scrollViewDidScroll委托方法的问题和更新UI

时间:2011-02-22 13:17:41

标签: iphone objective-c uiscrollview

我有一个滚动视图,我正在使用页面控件实现lazyload。我已经采用了apple的pagecontrol示例程序。

我在每个页面中加载了8个缩略图,缩略图本身从网络中获取并在UI上更新。图像视图已存在于UI中。在我的viewDidScroll方法中,我计算页码,然后更新其上下的其他页面,如下所示:

BOOL isScrollingDown = verticalScrollView.contentOffset.y > _previousContentOffsetY;

_previousContentOffsetY = verticalScrollView.contentOffset.y;

CGFloat pageHeight = verticalScrollView.frame.size.height;

int scrollingToPageNum = isScrollingDown ? (ceil((verticalScrollView.contentOffset.y - pageHeight) / pageHeight) + 1) : (floor((verticalScrollView.contentOffset.y - pageHeight) / pageHeight) + 1);
int page = floor((verticalScrollView.contentOffset.y - pageHeight / 2) / pageHeight) + 1;

[self loadPage:(page-1)];
[self loadPage:(page)];
[self loadPage:(page+1)];

/* Unloading the pages not seen in the view is done here*/
if (!(isScrollingDown) && scrollingToPageNum >1) {
    [self unloadPages:page-2];
}else {
    [self unloadPages:page+2];
}

用户界面太慢,用户体验非常糟糕。我想知道如何让UI更具响应性。

其他一些问题是: 1)我有一个下载图像的类,调用类实现下载器类的委托。下载映像后,将调用委托方法来更新UI。这会降低UI的响应速度吗?如何避免这种情况? 2)在没有UI无响应的情况下实现图像下载和更新UI的最佳方法是什么?

编辑: 我对如何最好地改进和实施此解决方案持开放态度。 我没有显式创建线程但我在异步模式下使用NSURLConnection,并且在检索数据时调用委托方法来更新UI。

2 个答案:

答案 0 :(得分:4)

我认为您可以从Apple示例LazyTableImages中使用的一些技术中获益匪浅。虽然它使用表视图作为示例,但概念可以轻松应用于滚动视图。

LazyTableImages

答案 1 :(得分:1)

每次调用scrollViewDidScroll时,您都会多次调用loadPage(至少,我假设您的意思是scrollViewDidScroll)。 loadPage做什么?如果它盲目地触发了一个通信请求,难怪你的应用程序会疯狂 - 你会同时多次请求同样的事情 - 你会看到每个不同的偏移量调用scrollViewDidScroll滚动视图

也许您应该考虑使用更合适的委托方法,例如scrollViewDidEndDecelerating:来编排事物。 Mark Adam的回答也是非常好的建议。

这个问题和答案也解释了同样的问题:

My App calls scrollViewDidScroll 19 times

相关问题