4

私は Objective-C を初めて使用し、ユーザー インターフェイスの一部のデータを更新するために汎用 API へのバックグラウンド ポーリングを必要とするアプリを構築しています。私の問題に合った回答/例を数時間探した後、次のような解決策に出くわしました。

Objective-C でのロングポーリング

起動時にアプリから外部サーバーをポーリングする

1 時間ごとに TCP サーバーにポーリングする ios

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

しかし、残念ながら、それらのどれも本当に基本的な私のシナリオをカバーしていません: viewDidLoadAPI を呼び出すために、無限ループとしましょう。10 秒ごととしましょう。を使用してコンソールにそのデータを送信しNSLogます。明らかに、これはメインスレッドでは実行できません。

私が本当に必要としているのは、それを行う方法の非常に簡単な例です。

  • 多くの理由で長いポーリング/プッシュ通知を実装できず、それを行う方法を探していません。できないと仮定しましょう。
  • LRRestyRESTKit、またはその他のような派手なフレームワーク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");
}

残念ながら、ここで述べたように: NSOperation を使用した非同期 NSURLConnectionは、私にはできないようです。

助けてください。この基本的なシナリオには単純で直接的な解決策がないとは信じていません。

4

0 に答える 0