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

标签 ios json web-services asynchronous xamarin.ios

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

基本上只是返回 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) Should I not be calling a service from the FinishedLaunching method in AppDelegate?

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

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

b) Am I calling the service incorrectly?

看起来不错。但是请记住,模拟器具有更快的网络访问速度(可能)、更多的 RAM 和 CPU 能力。大型数据集可能需要大量内存/CPU 时间来解码。

从另一个线程运行至少可以覆盖所需的额外时间。它可以像在 FinishedLaunching 中添加代码(如下)一样简单。

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

你可以看看如何Touch.Unit通过查看它的 TouchRunner.cs 来做到这一点源文件。

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

关于ios - 使用 Monotouch 和 iOS 从服务中提取数据 (JSON) 的理想方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011606/

相关文章:

ios - 使用 Codable 在 swift 4.2 中解析 Json

iphone - 数字签名是否被视为加密?

javascript - 使用 javascript 连接对象数组

c# - 在 C# 中基于已知的 XSD 创建 Web 服务

java - 无法使用 Web 服务的二维对象返回值

c# - PHP SOAP 不断返回旧结果

ios - 使用按钮进行水平 ScrollView /页面控制

IOS:来自 UISwipeGestureRecognizer 的 UIButton

python - Flask 中的 jsonify 和 tojson 有什么区别?

java - 如何在 Java 中检索特定的 Json 元素