1

RKObjectManager のタイムアウトを実装しています。私のコードスニペットは次のとおりです。

-(void)getObjects
{
    RKObjectManager *sharedManager = [RKObjectManager sharedManager];

    [self showLoading];
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];

    // Setting timeout here. goto failure 
    self.nTimer = [NSTimer scheduledTimerWithTimeInterval:TIMEOUT_INTERVAL target:self selector:@selector(didEncounterError) userInfo:nil repeats:NO];
}

- (void) didEncounterError
{    
    [self hideLoading];
    [self standardErrorHandling];

    //invalidate timer, this is done to ensure that if error occurs before timer expiry time, the error will not show again when timer is up (ISSUE HERE)
    [self.nTimer invalidate];
}

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects 
{
    ....
    //invalidate timer if load is successful (no issue here)
    [self.nTimer invalidate];
}


- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error 
{
    ....
    //trigger encounter error method
    [self didEncounterError];
}

上記の実装では、「遭遇エラー」メソッドで常にタイマーを無効にします。これは、タイマーが切れる前にエラーが発生するケースを軽減するためです。この場合、タイマーを無効にして、エラー メッセージが再び表示されないようにします。

ただし、エラーが発生した後 (タイマーが期限切れになる前) にもう一度エラー メッセージが表示されます。「遭遇エラー」メソッドの無効化が機能しなかったようです。私のコードの何が問題なのかアドバイスはありますか?

4

1 に答える 1

7

タイマーの無効化は、スケジュールされているスレッドで発生する必要があります。上記の場合、タイマーは別のスレッドで呼び出されます(コールバック)。この無効化を行うメソッドを作成し、コールバックメソッドで「performSelectorOnMainThread」を使用してそのメソッドを呼び出すことはできますか?

于 2011-10-11T06:13:30.933 に答える