2012-04-10 92 views
0

我想在滚动动画发生期间加载带有数据的网页视图。动画呼叫就是这样:加载UIWebView块滚动视图动画

[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:基本URL:方法被调用在非主线程,

- (void)webViewDidStartLoad:(UIWebView *)theWebView 

- (void)webViewDidStartLoad:(UIWebView *)theWebView 

方法在主线程中调用。所以这个方法没有提供我一个改进。

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

还能做什么?

回答

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线程,因为所有的负载应该做的事在背景中。

+1

remmeber为您的ivar使用__block – 2012-04-10 13:44:29

+0

嗯,明天我会试试。我认为应该在主线程中调用UI组件的任何方法。 – manuyavuz 2012-04-10 18:50:32

+0

@Vlad,我试过你的解决方案,但它不工作。详情在我的编辑。 – manuyavuz 2012-04-11 07:34:37