我是 Objective-c 的新手,我正在构建一个应用程序,该应用程序需要对通用 API 进行后台轮询以刷新我的用户界面上的一些数据。经过几个小时寻找适合我的问题的答案/示例后,我遇到了一些解决方案,如下所示:
http://blog.sortedbits.com/async-downloading-of-data/
但不幸的是,它们都没有涵盖我真正基本的场景:我需要在何时启动轮询viewDidLoad
,假设是一个无限循环,并且在每次迭代时,假设每 10 秒调用一次 API,当我做接收数据时我想记录用 将数据输入控制台NSLog
,显然这不能在主线程上完成。
我真正需要的是一个非常简单的例子来说明如何做到这一点,简单的意思是:
- 由于多种原因,我无法实现长轮询/推送通知,并且没有寻找方法,让我们假设我不能。
- 我不想依赖像
LRResty
,或其他任何花哨的框架RESTKit
,AFNetworking
因为我真的不需要它们,而且我不敢相信没有可以涵盖这个基本场景的 SDK 公告。 - 除了我所描述的之外,我不需要任何其他东西,所以没有身份验证,我的请求中没有参数,没有响应处理等(因为我是 Objective-c 的新手,而且不是严格需要的东西可能会让我更加困惑。 ..)
我正在寻找的解决方案可能是这样的(使用 NSOperationQueue 将我的循环运行到一个单独的线程中):
- (void)viewDidLoad {
[super viewDidLoad];
//To run polling on a separate thread
operationQueue = [NSOperationQueue new];
NSInvocationOperation *operation=[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doPolling) object:nil];
[operationQueue addOperation:operation];
}
-(void)doPolling {
MyDao *myDao = [MyDao new];
while (true) {
[myDao callApi];
[NSThread sleepForTimeInterval:10];
}
}
// and in MyDao
-(void)callApi {
NSMutableString *url= [NSMutableString stringWithFormat:@"%@",@"http:www.example.it"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
request.HTTPMethod = @"GET";
self.conn= [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(self.conn){
[self.conn start];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"didReceiveData %s","yes");
}
但不幸的是,如此处所述:Asynchronous NSURLConnection with NSOperation看起来我做不到。
请帮忙,我拒绝相信对于这个基本场景没有简单直接的解决方案。