在iPhone应用程序中轮询Web服务的正确方法

时间:2011-04-04 02:39:10

标签: iphone web-services cocoa-touch polling

我正在尝试确定每分钟轮询一次web服务的最佳策略,解析返回的xml,然后更新存储在共享实例中的对象。此过程需要在单独的线程中运行,并且只要应用程序正在运行,它就会继续运行。

似乎我可以将所有代码调用web服务并将xml解析为NSOperation,并在应用程序启动后立即将NSOperation添加到存储在app delegate中的NSOperationQueue。

在NSOperation的主方法中使用NSTimer是否正确,这样操作将无限期地每分钟循环一次?在那种情况下,NSOperation永远不会真正回归 - 这似乎是我想要的,但我不确定这是否是正确的思考方式。

我想解决的问题当然非常普遍,所以我试图弄清楚实现它的正确方法。任何建议都非常感谢。

4 个答案:

答案 0 :(得分:0)

真正正确的方法是使用push notifications。如果您的任何用户的单元格计划包含有限的数据或根据使用情况收取的数据,他们会感谢您。

但是如果你坚持轮询,你也可以直接使用NSTimer,而不是在NSOperation中弄乱计时器。这将在主线程上运行,但您可以让计时器回调使用performSelectorInBackground:withObject:在后​​台进行处理。或者您可以完全跳过计时器并在单独的NSThread上运行整个轮询序列,并使用sleepForTimeInterval:在轮询之间延迟。

答案 1 :(得分:0)

我强烈建议你看一下ASIHTTPRequest。这是一个多么令人惊叹的小班,并且有很好的记录。

编辑:

看一下this answer似乎是最佳解决方案。

答案 2 :(得分:0)

一种方法:创建一个线程并使用运行循环,根据需要更新或空闲。然后你可以从辅助线程执行请求,并在解析/准备好之后将其发布到应用程序的其余部分。

这种方式可以更好地控制暂停/恢复/延迟/定时,并且您可以轻松控制活动请求的数量(应该是零或一个)。

答案 3 :(得分:-1)

我不会将NSTimer用于此问题/设计。我会在应用程序启动时从AppDelegate创建NSThread。我会降低这个线程的优先级。在NSThread主方法内部基本上是一个循环。

-(void)main {

    while(true) {
        // get raw data from url
        // hash the result
        // compare the hash to the last time
        if (currentHash != lastHash) {
          // post a notification to default center with the new data
          lastHash = currentHash;
        }
        // sleep the thread sleepForTimeInterval
    }
}

您的Model对象将订阅来自线程的通知并解析新数据并更新ivars。您的View对象将使用KVO监听模型并显示任何更新/更改。