2011-11-04 39 views
4

我有一個iPhone應用程序正在從ASP.NET MVC服務中提取所有數據。使用Monotouch和iOS從服務中提取數據(JSON)的理想方法?

基本上只是返回JSON。

當我在模擬器中運行應用程序時,數據被非常快地拉下來等等。但是當我使用實際設備(3G或WiFi)時,它非常慢。應用程序崩潰時間過長。

a)我不應該從AppDelegate中的FinishedLaunching方法調用服務嗎?

b)我是否錯誤地撥打了該服務?

我使用的方法是這樣的:

public static JsonValue GetJsonFromURL(string url) { 
    var request = (HttpWebRequest)WebRequest.Create (url); 
    request.AutomaticDecompression = DecompressionMethods.GZip |  DecompressionMethods.Deflate; 
    using(var response = (HttpWebResponse)request.GetResponse()) { 
      using(var streamReader = new StreamReader(response.GetResponseStream())) { 
       return JsonValue.Load(streamReader); 
      } 
    } 
} 

有沒有更好的或者更直接的方式,我應該查詢服務?我讀過關於在不同線程上執行操作或執行異步調用以不鎖定UI的問題,但我不確定最佳方法或代碼如何工作。

回答

4

a)我不應該從AppDelegate中的FinishedLaunching方法調用服務嗎?

您只有有限的時間讓應用程序啓動並運行,即從FinishedLaunching返回,否則iOS監視程序將會終止您的應用程序。總共約17秒(但可能因設備/ iOS版本而異)。

任何需要一些時間的事情最好在另一個線程完成,從FinishedLaunching啓動。如果您使用網絡服務,則更爲重要,因爲您無法確定能夠獲得答案的時間(或甚至)是多少。

b)我是否錯誤地撥打了該服務?

看起來很好。但請記住,模擬器可以更快地訪問網絡(可能),更多的RAM和CPU功率。大型數據集可能需要大量內存/ CPU時間來解碼。

從另一個線程運行將至少覆蓋額外所需的時間。它可以像在FinishedLaunching內添加代碼一樣簡單。

ThreadPool.QueueUserWorkItem (delegate { 
    window.BeginInvokeOnMainThread (delegate { 
     // run your code 
    }); 
}); 

你可以看看通過查看其TouchRunner.cs源文件Touch.Unit是怎麼做的。

備註:您可能想要測試不使用(詢問)壓縮數據,因爲解壓縮它的時間/內存可能對設備沒有幫助(與模擬器相比)。實際測試需要確認;)

相關問題