我有一个 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/