Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Monotouch和iOS从服务中提取数据(JSON)的理想方法?_Ios_Json_Web Services_Asynchronous_Xamarin.ios - Fatal编程技术网

使用Monotouch和iOS从服务中提取数据(JSON)的理想方法?

使用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) {

我有一个iPhone应用程序,它从ASP.NETMVC服务中提取几乎所有的数据

基本上只是返回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的文章,但我不确定最好的方法是什么,也不确定代码如何工作

a) 我是否应该从AppDelegate中的FinishedLaunching方法调用服务

您启动和运行应用程序的时间有限,即从
FinishedLaunching
返回,否则iOS看门狗将杀死您的应用程序。总共约17秒(但可能因设备/iOS版本而异)

任何需要一些时间的事情最好在另一个线程中完成,从
FinishedLaunching
启动。如果你使用网络服务,这一点更为重要,因为你无法确定有多少时间(甚至是否)可以得到答案

b) 我打错电话了吗

看起来不错。但是,请记住,模拟器可以更快地访问网络(很可能),更大的RAM和CPU功率。大型数据集解码可能需要大量内存/CPU时间

从另一个线程运行将至少覆盖所需的额外时间。只需在
FinishedLaunching
中添加以下代码即可

ThreadPool.QueueUserWorkItem (delegate {
    window.BeginInvokeOnMainThread (delegate {
        // run your code
    });
});
您可以通过查看其源文件来了解它是如何工作的

注意:您可能希望测试不使用(请求)压缩数据,因为解压缩的时间/内存在设备上可能没有帮助(与模拟器相比)。需要确认的实际测试;)