2

私はJavaScriptで実装されたモバイルアプリに取り組んでいます。これは、主にサーバーから(JSONPを介して)データをフェッチし、ローカルストレージを使用してデータベースに書き込むなど、多くのバックグラウンド処理を実行する必要があります。フォアグラウンドでは、ユーザーはローカルに保存されたデータをナビゲートする可能性があるため、スムーズに反応するアプリが必要です。

この相互作用(JSONPを介してサーバーからデータをフェッチし、それを使ってマイナーな作業を行った後、ローカルデータベースに保存する)は非同期で行われますが、JSONPに必要なDOM操作とデータベースの相互作用のため、これを行うことはできませんWebWorkers。したがって、多くの「バックグラウンド処理要求」でJavaScriptイベントキューをブロックするという問題が発生し、アプリの反応が非常に遅くなります(または完全にロックされます)。

これが私が背景をやっている方法の小さなスケッチです:

    var pendingTasksOnNewObjects = new Object();
    
    //add callbacks to queue
    function addTaskToQueue(id, callback) {
        if (!pendingTasksOnNewObjects[id]) {
            pendingTasksOnNewObjects[id] = new Array();
        }
        pendingTasksOnNewObjects[id].push(callback);
    }
    
    // example for this pending tasks:
    var myExampleTask = function () {
        this.run = function(jsonObject) {
            // do intersting stuff here as early as a specific new object arrives
            // i.e. update some elements in the DOM to respect the newly arrived object
        };
    };
    addTaskToQueue("id12345", myExampleTask);
    
    // method to fetch documents from the server via JSONP
    function getDocuments(idsAsCommaSeparatedString) {
        var elem;
        elem = document.createElement("script");
        elem.setAttribute("type", "text/javascript");
        elem.setAttribute("src", "http://serverurl/servlet/myServlet/documents/"+idsAsCommaSeparatedString);
        document.head.appendChild(elem);
    }
    
    // "callback" method that is used in the JSONP result to process the data
    function locallyStoreDocuments(jsonArray) {
        var i;
        for (i=0; i<jsonArray.length; i++) {
            var obj = jsonArray[i];
            storeObjectInDatabase(obj);
            runTasks(obj.docID, obj);
        }
        return true;
    }
    
    // process tasks when new object arrives
    function runTasks(id, jsonObject) {
        if(pendingTasksOnNewObjects[id]) {
            while(pendingTasksOnNewObjects[id][0]) {
                pendingTasksOnNewObjects[id][0].run(jsonObject);
                pendingTasksOnNewObjects[id].shift();
            }
        }
        return true;
    }

JavaScriptのイベント処理メカニズム(つまり、タイマーの操作に関するJohn Resigsの説明)についてはすでに読んでいましたが、本当にやりたいことは次のとおりです。イベントキューに何かすることがあるかどうかを確認します。その場合は、100ミリ秒待ってから、もう一度確認してください。現在キューで待機しているものがない場合は、少量のデータを処理して再度確認してください。

私が読んだ限りでは、JavaScriptはイベントキューに直接アクセスできないため、これは不可能です。

では、UIイベントに干渉しないようにコードを最適化して、ユーザーがアプリをスムーズに操作できるようにするための設計上のアイデアはありますか?

4

1 に答える 1

1

Web Workers は iOS 5 で利用できるようです ( http://caniuse.com/webworkers )

于 2011-11-17T08:03:19.690 に答える