2012-07-23 70 views
0

我們有一個Phonegap/Cordova(1.6.0)應用程序,它使用SenchaTouch(1)作爲它的用戶界面和一個自定義本地(iOS)插件來解壓縮文檔文件夾中的文件。該插件沒有自己的GUI。如何在從iOS原生插件調用SenchaTouch時更新UI?

我們想通過更新我們的煎茶的應用程序的進度條(或只是一個對話框)的解壓縮操作時顯示進度。我們在原生插件中實現了一個更新函數,該函數使用「writeJavascript」方法從本地代碼調用Javascript代碼。

調用該功能的作品,但沒有在我們的煎茶UI圖形用戶界面的更新,我們做出的實際展示,調試日誌語句也不會顯示。只有在我們的代碼之間添加一個Javascript警告框時,我們才能觀察到Sencha更新已處理,UI中的內容發生了變化。這感覺好像Sencha異步執行所有操作,並且代碼以某種方式被阻止。

我們有什麼缺失?

回答

0

這是一個長期運行的操作阻塞UI線程的一個典型的例子。我猜想軟件開發中的事情永遠不會改變。

的基本問題是,如果你從你的HTML應用程序調用的PhoneGap插件,圖形線程(和只有一個線程)爲您的PhoneGap應用程序被阻止。解決方案很簡單:只要您可以從插件中返回即可。

對於長時間運行的操作,這意味着在一個單獨的線程啓動它們。 iOS上非常優雅的機制是使用Grand Central Dispatch,如another Stackoverflow answer所示。

您在dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ });塊中執行長時間運行操作,然後使用writeJavascript將更新發送回嵌套的dispatch_async(dispatch_get_main_queue(), ^{ });塊中的Phonegap UI。