0

UIにSenchaTouch(1)を使用するPhonegap / Cordova(1.6.0)アプリケーションと、Documentsフォルダー内のファイルを解凍するためのカスタムネイティブ(iOS)プラグインがあります。プラグインには独自のGUIがありません。

Senchaアプリのプログレスバー(または単にダイアログ)を更新して、解凍操作中の進行状況を表示したいと思います。「writeJavascript」メソッドを使用してネイティブコードからJavascriptコードを呼び出す更新関数をネイティブプラグインに実装しました。

その機能を呼び出すと機能しますが、Sencha UIで行ったGUI更新は実際には表示されず、デバッグログステートメントも表示されません。コードの間にJavascriptアラートボックスを追加した場合にのみ、Senchaの更新が処理され、UIで何かが変更されたことを確認できます。Senchaがすべてを非同期で実行し、そのコードが何らかの形でブロックされているように感じます。

何が欠けていますか?

4

1 に答える 1

0

これは、UIスレッドをブロックする長時間実行操作の典型的な例です。ソフトウェア開発では物事は決して変わらないと思います。

基本的な問題は、HTMLアプリケーションからPhonegapプラグインを呼び出すと、Phonegapアプリケーションのグラフィックスレッド(およびスレッドは1つだけ)がブロックされることです。解決策は簡単です。プラグインからできるだけ早く戻ってください。

長時間実行される操作の場合、これは別のスレッドでそれらを開始することを意味します。別のStackoverflowの回答で示されているように、iOSの非常に洗練されたメカニズムは、これにGrandCentralDispatchを使用することです。

ブロックで長時間実行する操作を実行してから、を使用してネストされたブロックdispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });のPhonegapUIに更新を送り返します。dispatch_async( dispatch_get_main_queue(), ^{ });writeJavascript

于 2012-07-25T15:33:14.387 に答える