0

スクロール アニメーションの発生中に Web ビューにデータを読み込もうとしています。アニメーション呼び出しは次のようになります。

[scrollView scrollRectToVisible:aFrame animated:YES];

問題は、Web ビューのロード プロセスがスクロールビュー アニメーションとオーバーラップする場合、アニメーションが途切れ、スムーズなアニメーションが発生しないことです。ロード プロセスがメイン スレッドをブロックしているように見えるため、アニメーションが期待どおりに動作しません。

この問題を解決するにはどうすればよいですか? 一部の投稿では、webview をサブビューとして最後の部分に配置することを提案しています。

- (void)webViewDidFinishLoad:(UIWebView *)theWebView

方法。しかし、私がそれを好きなら、ロードされたデータは見えません。

手伝ってくれてありがとう。

編集1:

@ヴラド

この解決策は機能していないと思います。私は次のように webview load を呼び出しています:

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 に答える