0

我正在编写一个 iPad 应用程序,它从 Web 服务器上的 XML 文件中提取各种坐标,解析信息,并将它们呈现在屏幕上。

我想知道你们是否有关于如何让它连续刷新数据的提示/建议,比如说,每秒(因为计算机程序每隔几秒更新一次服务器上的 XML 文件)。谢谢!

4

3 回答 3

2

您肯定需要为此实现多线程后台操作,否则您的应用程序将完全无响应。在我继续之前,我必须声明,不断地向服务器查询应用程序的整个执行过程是一个坏主意,它不仅会咀嚼数据,而且必须保持 Wi-Fi/3G/4G 天线始终处于活动状态会耗尽用户的电池快得多。

我会考虑放宽要求,例如每 10 秒左右(因为服务器每隔几秒才更新一次数据,您必须考虑下载和渲染当前抓取的坐标的时间),甚至等待供用户按下刷新按钮等。

要回答目前的问题,有几种方法可以做到这一点,其中最简单的可能是使用像ASHTTPRequest这样的框架(尽管它不再维护,对于现代项目,有像AFNetworking这样的库)。它们处理从服务器异步下载数据以及许多其他有用的网络功能。

满足您要求的理想流程如下所示:

  1. 创建 NSOperationQueue(或添加的网络库中的队列)
  2. 使用 NSTimer 继续创建子类 NSOperation 以从服务器下载(或再次,网络库中的等效函数)。每隔x秒,它就会将此请求发送到队列。
  3. 完成下载后,使用新数据更新 UI(请注意,更改 UI 的任何功能都必须从主线程完成,因此如果您在 NSOperation/etc 中处理此问题,则必须使用 aperformSelectorOnMainThread或等效的! )

希望有帮助!如果您不想包含外部库,我确实有一个小示例项目,它创建子类 NSOperation 的实例,该实例执行 NSURLConnection,将它们发送到 NSOperationQueue 并同时执行它们。您可以轻松地将其修改为一次只执行一项操作,更改 NSURLConnection 以下载和解析服务器数据,然后更新主线程。如果你有兴趣,它就在这里。

于 2012-07-13T02:01:27.530 回答
2

看看NSTimer及其scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:方法

一个可行的解决方案可能是

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:refreshData userInfo: nil repeats:YES ]

和调用对象的方法

-(void) refreshData {
    //Do your call here
}
于 2012-07-13T02:01:32.557 回答
0

考虑在服务器上准备好新数据时向设备发出推送通知。

这将节省设备电量,节省大量服务器负载,并且推送通常只需一秒钟左右即可到达,因此对于您的使用而言,延迟还不错。

唯一需要注意的是,您还必须实施某种轮询,以防用户拒绝允许推送通知。但是对他们来说,你可以有很长的轮询周期,并告诉他们如果他们启用推送支持,刷新会更快......

于 2012-07-13T04:31:32.257 回答