加载UIWebView阻止滚动视图动画

时间:2012-04-10 13:03:56

标签: objective-c ios multithreading animation uiwebview

我正在尝试在滚动动画期间加载带有数据的Web视图。动画调用是这样的:

[scrollView scrollRectToVisible:aFrame animated:YES];

问题是,如果Web视图加载过程与滚动视图动画重叠,则动画会断断续续,而不会出现平滑动画。似乎加载进程阻塞了主线程,因此动画无法按预期工作。

为了解决这个问题,我该怎么办?在一些帖子中,人们建议将webview作为子视图放在

的最后部分
- (void)webViewDidFinishLoad:(UIWebView *)theWebView

方法。但是如果我喜欢的话,加载的数据是不可见的。

感谢您的帮助。

编辑1:

@Vlad

这个解决方案无法正常工作。我正在调用webview加载:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
    [_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]];
});

但是我看到虽然在非主线程中调用了loadHTMLString:baseURL:方法,但

- (void)webViewDidStartLoad:(UIWebView *)theWebView

- (void)webViewDidStartLoad:(UIWebView *)theWebView

方法在主线程中调用。所以这种方法没有给我带来改进。

另外,作为一个细节,webViewDidStartLoad和webViewDidFinishLoad方法之间的时间差不多是0.3秒。

还有什么可做的?

1 个答案:

答案 0 :(得分:0)

尝试在单独的线程上启动加载请求。 最简单的方法是使用GCD。

这应该是您的要求:

NSURLRequest *request = [NSURLRequest requestWithURL:someURL];

单独的线程调用将是这样的:

dispatch_queue_t workerQueue = dispatch_queue_create("QueueIdentifier", NULL);
dispatch_async(workerQueue, ^ {
    [yourWebView loadRequest:request];
});
dispatchRelease(workerQueue);

使用它不应再阻止你的UI线程,因为所有加载应该在后台完成。