1

10秒以上かかる場合にサーバー呼び出しを手動でタイムアウトするようにNSTimerオブジェクトを設定する必要があります(Restkitではサポートされていません)

これは以下の私のコードです。基本的に、私のローダークラスはloadObjectsAtResourcePathを使用してリクエストを委任します

10秒以上かかる場合は、サーバーでエラーが発生したときにRestkitが呼び出すのと同じ失敗メソッドを呼び出したい(didFailWithError)

しかし、私はそれを間違っていると感じています。さらに、failureメソッドには、デリゲートクラスでのみ初期化されるオブジェクトが必要です。

//CLASS FOR LOADING OBJECTS

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

    // loads the object via delegate
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];

    //creates an error
    NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];

    // Setting timeout here. goto failure 
    nTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self.delegate selector:@selector:(objectLoader:nil didFailWithError:error:) userInfo:nil repeats:NO];
}


// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
..
}

// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
..
}

これを行う正しい方法は何ですか?

4

2 に答える 2

2

デリゲートコールバック以外のメソッドでタイムアウトを処理することをお勧めします。あなたが言うように、デリゲートメソッドはクラス内で作成されたオブジェクトを必要とします。そして、おそらく「実際のエラー」とタイムアウトをまったく同じ方法で処理したくないでしょう?タイムアウトを使用すると、たとえば、再試行するオプションが必要になる場合があります。

タイムアウトとエラーで失敗してまったく同じことを実行したい場合は、別の方法を使用できます。

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

    // loads the object via delegate
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];

    //creates an error
    NSError *error = [NSError errorWithDomain:@"world" code:200 userInfo:nil];

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


- (void)didTimeout {
    NSLog(@"Error");
}

// handles failure
- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {
    [self didTimeout];
}

// handles success
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
    //don't forget to invalidate the time or else you'll get errors even when successful
    [nTimer invalidate];
}

もちろん、必要に応じてこれを拡張してより柔軟にすることもできますが、これはあなたが求めたことをカバーしているようです。

于 2011-08-03T01:56:40.187 に答える
1

RestKitに精通していませんが、私が最初に考えるのは、スケジュールされたセレクターを、did failメソッドではなく、検証メソッドを呼び出すように設定し、検証メソッドに有効な応答が受信されたかどうかを確認させる方がはるかに良いということです。定義された時間、それがキャンセルされていない場合は、リクエストなどをキャンセルして失敗を呼び出します。

私はRestKitに精通していませんが、NSURLRequestsの使用に精通しており、タイムアウトエラーを生成するリクエストを発行するときにタイムアウトを定義できることを知っています-それが役立つかどうかはわかりません...

于 2011-08-02T22:24:12.067 に答える