使用 Monotouch 和 iOS 从服务中提取数据 (JSON) 的理想方式?
Posted
技术标签:
【中文标题】使用 Monotouch 和 iOS 从服务中提取数据 (JSON) 的理想方式?【英文标题】:Ideal way to pull data (JSON) from a service using Monotouch and iOS? 【发布时间】:2011-11-04 15:21:26 【问题描述】:我有一个 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 的信息,但我不确定最佳方法或该代码如何工作。
【问题讨论】:
【参考方案1】: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 的工作原理。
注意:您可能想要测试不使用(询问)压缩数据,因为解压缩它的时间/内存可能对设备没有帮助(与模拟器相比)。实际测试需要确认;)
【讨论】:
以上是关于使用 Monotouch 和 iOS 从服务中提取数据 (JSON) 的理想方式?的主要内容,如果未能解决你的问题,请参考以下文章
如何从终端在 iOS 模拟器中运行 MonoTouch 应用程序?
如何在 SQLite 中使用 FTS 和 Monotouch for iOS