0

コードは次のように表示されます。ボタンをクリックすると、4秒ごとにタイマーとタイマー呼び出しメソッドがアクティブになります。ただし、サーバーがデータを返すのに4秒では不十分な場合があります。ただし、サーバーが1秒以内にデータを返し、ユーザーがそれ以上待機するのが適切でない場合は、タイマー値を増やすことも適切な解決策ではありません。この場合の最良/最適な解決策はわかりません。

-(IBAction)play:(id)sender{
    timer=[NSTimer scheculedWith TimerInterval(4.0) target:(self)selector:@selector(httpRequest) userinfo:nil repeats:YES]
    }
    -(void)httpRequest{

    _weak ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url1];
    [request1 setCompletionBlock:^{
        NSString *responseString1 = [request1 responseString];
    //dispatch_async(backgroundProcess1,^(void){
        [self plotOverlay1:responseString1];
     //});
    }];
    [request1 setFailedBlock:^{
        NSError *error=[request1 error];
        NSLog(@"Error: %@", error.localizedDescription);
    }]; 

    [request1 startAsynchronous];
    }
4

1 に答える 1

1

データを継続的に更新したいだけの場合-httpRequestは、最初のリクエストの完了ブロック内から再度呼び出すことを検討してください (そしてタイマーを削除します)。そうすれば、リクエストが再度実行されることを保証できますが、それは最初のリクエストが終了したでのみです。また、そこで遅延を導入できるため、「最初のチェックが終了してから 2 秒後に再度チェックする」などの処理が行われます。

これは次のようになります。

- (void)httpRequest {
    __weak ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url1];
    [req setCompletionBlock:^{
        NSString *resp = [req responseString];
        [self plotOverlay1:resp];

        [self httpRequest];
        // or...
        [self performSelector:@selector(httpRequest) withObject:nil afterDelay:2.0];
    }];
    /* snip fail block */
    [req startAsynchronous];
}
于 2012-09-24T23:02:16.537 に答える