1

UIWebView で非同期にコンテンツを読み込むハイブリッド プロジェクトに取り組んでいます。

コンテンツのダウンロードをどこで行うかを考えています。

1 つのオプションは、UIWebView 内で非同期読み込みを行うことです。

$.ajax({
        url: "http://hostname.com/login",
        type: 'POST',
        dataType: 'text',
        data: login_info,
        success: function (data) {
        },
        error: function (xhr) {}
})

2 番目のオプションは、Javascript ブリッジを介したネイティブ コードです。

$.ajax({
        url: "myprotocol://login",
        type: 'POST',
        dataType: 'text',
        data: login_info,
        success: function (data) {
        },
        error: function (xhr) {}
})

捕まえろ:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest: (NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType 
{
if([self containsCustomProtocol:request]) {
    //do native call
    return NO;
}

そして、メインスレッドのリターン時にこれを呼び出します:

[this.webView stringByEvaluatingJavaScriptFromString:@"methodName()"];

何が一番いいでしょうか?最初の方法ではスレッドの生成はありませんか、2番目の方法でははいですか、それとも問題ではありませんか?

4

1 に答える 1

3

IIRC のすべての Web リクエストは、特定の Web ロード GCD キューで行われます。いくつかの長いデュラリオン リクエストを開始してから、デバッガーでアプリを停止することで、簡単にテストできます。次に、表示されるスレッドを確認します。

キュー モードを見ると、そのような名前のキューは 1 つだけにする必要があります。スレッド モードでは、複数のスレッドが表示される場合があります。これは、GCD がスレッドを使用および再利用して、GCD で最も効率的な方法でブロックを実行するためです。

内部的には、webview は NSURLLoading および NSURLProtocol クラスも使用します。したがって、どちらのアプローチにも考えられる利点はありません。

Web ビューの外部からのトラフィックをある程度制御したい場合は、独自の http プロトコル ハンドラー (または独自のスキーム) を登録するか、Web ビューで使用される NSURLCache をオーバーライドすることで取得できます。キャッシュは単一のスレッドでアクセスされますが、NSURLProtocol は複数の操作を並行して (おそらくマルチスレッドで) 処理します。

于 2012-12-21T07:12:34.753 に答える