4

我是 Objective-c 的新手,我正在构建一个应用程序,该应用程序需要对通用 API 进行后台轮询以刷新我的用户界面上的一些数据。经过几个小时寻找适合我的问题的答案/示例后,我遇到了一些解决方案,如下所示:

Objective-C 中的长轮询

启动时从应用程序轮询外部服务器

每小时轮询一次 TCP 服务器 ios

http://blog.sortedbits.com/async-downloading-of-data/

但不幸的是,它们都没有涵盖我真正基本的场景:我需要在何时启动轮询viewDidLoad,假设是一个无限循环,并且在每次迭代时,假设每 10 秒调用一次 API,当我做接收数据时我想记录用 将数据输入控制台NSLog,显然这不能在主线程上完成。

我真正需要的是一个非常简单的例子来说明如何做到这一点,简单的意思是:

  • 由于多种原因,我无法实现长轮询/推送通知,并且没有寻找方法,让我们假设我不能。
  • 我不想依赖像LRResty,或其他任何花哨的框架RESTKitAFNetworking因为我真的不需要它们,而且我不敢相信没有可以涵盖这个基本场景的 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看起来我做不到。

请帮忙,我拒绝相信对于这个基本场景没有简单直接的解决方案。

4

0 回答 0