使用Monotouch和iOS从服务中提取数据(JSON)的理想方法?
我有一个iPhone应用程序,它从ASP.NETMVC服务中提取几乎所有的数据 基本上只是返回JSON 当我在模拟器中运行应用程序时,数据很快被拉下来,等等。。但是,当我使用实际设备(3G或WiFi)时,速度非常慢。以至于应用程序因时间过长而崩溃 a) 我是否应该从AppDelegate中的FinishedLaunching方法调用服务 b) 我打错电话了吗 我使用的方法是这样的:使用Monotouch和iOS从服务中提取数据(JSON)的理想方法?,ios,json,web-services,asynchronous,xamarin.ios,Ios,Json,Web Services,Asynchronous,Xamarin.ios,我有一个iPhone应用程序,它从ASP.NETMVC服务中提取几乎所有的数据 基本上只是返回JSON 当我在模拟器中运行应用程序时,数据很快被拉下来,等等。。但是,当我使用实际设备(3G或WiFi)时,速度非常慢。以至于应用程序因时间过长而崩溃 a) 我是否应该从AppDelegate中的FinishedLaunching方法调用服务 b) 我打错电话了吗 我使用的方法是这样的: public static JsonValue GetJsonFromURL(string url) {
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的文章,但我不确定最好的方法是什么,也不确定代码如何工作
a) 我是否应该从AppDelegate中的FinishedLaunching方法调用服务
您启动和运行应用程序的时间有限,即从FinishedLaunching
返回,否则iOS看门狗将杀死您的应用程序。总共约17秒(但可能因设备/iOS版本而异)
任何需要一些时间的事情最好在另一个线程中完成,从FinishedLaunching
启动。如果你使用网络服务,这一点更为重要,因为你无法确定有多少时间(甚至是否)可以得到答案
b) 我打错电话了吗
看起来不错。但是,请记住,模拟器可以更快地访问网络(很可能),更大的RAM和CPU功率。大型数据集解码可能需要大量内存/CPU时间
从另一个线程运行将至少覆盖所需的额外时间。只需在FinishedLaunching
中添加以下代码即可
ThreadPool.QueueUserWorkItem (delegate {
window.BeginInvokeOnMainThread (delegate {
// run your code
});
});
您可以通过查看其源文件来了解它是如何工作的
注意:您可能希望测试不使用(请求)压缩数据,因为解压缩的时间/内存在设备上可能没有帮助(与模拟器相比)。需要确认的实际测试;)