12

iOSアプリケーションでサーバーから定期的にデータをポーリングする必要があります。UIを使いやすくするために、スレッドで10秒ごとに実行する必要があります。この関数は、ユーザーがログインしたときに起動されます。この機能を実現するためにNSRunLoopwithを使用することを考えており、 JSONデータを取得するために使用することも考えています。NSTimerAFNetworking

これは正しいアプローチですか?これは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 のブロックは、リクエストが完了するとメインで実行されます。

秘訣は、モデルの変更を監視してビューを更新するために、アプリの他の部分をセットアップする必要があるということです。これは、sendAsynch ブロックでテーブルのリロードを実行するのと同じくらい簡単な場合もあれば、モデルが変更されたときにトリガーされる KVO を設定するなどのより複雑な場合もあります。

于 2012-10-30T14:35:46.447 に答える