12

我需要在我的 iOS 应用程序中定期从服务器轮询数据。我需要在线程中每 10 秒执行一次,以保持 UI 可用。用户登录时会触发此功能。我正在考虑使用NSRunLoopwithNSTimer来实现此功能,并且可能用于AFNetworking获取 JSON 数据。

这是正确的方法吗?这应该使用 GCD 来完成吗?

4

1 回答 1

19

可能唯一必须在主线程之外完成的部分是请求本身。确定您需要一个请求并形成该请求可以在没有任何花哨的东西的情况下完成......

同意 H2CO3 的观点,轮询可能会成为你的服务器在野外有太多客户端的问题,但也同意你的观点,在所有情况下都不一定是错误。

设置定时器...

[NSTimer scheduledTimerWithTimeInterval:10.0
                                 target:self
                               selector:@selector(timerFired:)
                               userInfo:nil
                                repeats:YES];

运行请求...

- (void)timerFired:(NSTimer *)timer {

    NSURLRequest *request = // setup your request
    [NSURLConnection sendAsynchronousRequest:request 
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if (!error) {
       // change my model in an observable way, or
       // if we're in a vc, change my model and update the UI

       // if we want to stop polling, [timer invalidate];
    }
}];

NSTimer 定期触发。发生火灾时,一个方法(在主线程上)决定是否需要轮询(在您描述的情况下,如果在 10 秒内调用它,则始终为“是”)。形成请求, NSURLConnection sendAsynchronousRequest: 将请求的慢速部分移出主请求。当请求完成时, sendAsynch 上的块会在 main 上运行。

诀窍是需要设置应用程序的其他部分以观察模型的变化并更新视图。这可能就像在 sendAsynch 块中重新加载表一样简单,或者更复杂,例如设置将在模型更改时触发的 KVO。

于 2012-10-30T14:35:46.447 回答