0

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

[scrollView scrollRectToVisible:aFrame animated:YES];

问题是,如果 web 视图加载过程与滚动视图动画重叠,则动画会卡顿,不会出现流畅的动画。似乎加载过程正在阻塞主线程,因此动画无法按预期工作。

我能做些什么来解决这个问题?在一些帖子中,人们建议将 webview 作为子视图放在

- (void)webViewDidFinishLoad:(UIWebView *)theWebView

方法。但是如果我这样做,加载的数据是不可见的。

感谢帮助。

编辑1:

@弗拉德

我猜这个解决方案不起作用。我这样调用 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 秒。

还有什么可做的?

4

1 回答 1

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 线程,因为所有加载都应在后台完成。

于 2012-04-10T13:32:34.600 回答