当应用程序在iOS中在单独的线程中处于活动状态时,定期从服务器轮询数据的最佳方法是什么?

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

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

可能必须在主线程上完成的唯一部分是请求本身。 决定你需要一个请求并形成这个请求可以在没有任何花哨的东西的情况下完成……

同意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:将请求的缓慢部分移出main。 当请求完成时,sendAsynch上的块在main上运行。

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