4

現在、ASIHTTPRequestとSBJsonを使用したプロジェクトをRestKitに移行しています。

以前の実装では、NSOperationを使用してHTTPリクエストを作成し、JSONオブジェクトを解析して、CoreDataAPIに必要な呼び出しを行いました。

私はこれを次のようにリファクタリングしました:

@implementation UpdateBeers

#pragma mark - NSOperation

- (void)main {
    [[RKClient sharedClient] get:@"/beers" delegate:self]; 
}

- (void)request:(RKRequest*)request didLoadResponse:(RKResponse*)response {  
    debug(@"didLoadResponse");
}  

- (void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error {
    debug(@"%@", error);
}

#pragma mark - Memory

- (void) dealloc {
    [super dealloc];
}

@end

以下がログに表示されます

GETリクエストをURLhttp:// localhost:9091 / api/testに送信します。HTTPボディ:

問題は、サーバーがリクエストを受信しないことです。

次の行を追加します。

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];

mainメソッドの最後までこの問題を解決します。

私の質問は:

ResKit API呼び出しをNSOperationとして実行する必要がありますか?そうでない場合、バックグラウンドで呼び出しを行うための代替手段は何ですか?

前もって感謝します。

4

1 に答える 1

6

おそらく、私はここで全体的な問題を完全には理解していません...ネットワークからリソースをロードすることに関してRestKitが行うことはすべて、すでにバックグラウンドにあります。ほとんどすべてが既に非同期であるため、既存の非同期 RestKit メソッドを NSOperation 内で実行すると重複し、非生産的になります。とはいえ、RestKit がデータのダウンロードが完了したことを通知したら (didLoadResponse)、その部分が計算集約的で UI とは無関係である場合は、NSOperation で後続の後処理を実行することをお勧めします。それ以外の場合は、RestKit を考え抜こうとしないでください。例のように実行するだけで、非同期の良さを利用できます。

さらに、同時に複数のリクエストを開始する予定がある場合は、RestKit のリクエスト キューの使用を検討することをお勧めします。それはまだすべてを非同期にダウンロードしますが、一度に指定した数のリクエストしか実行しません...私のアプリが更新されているとき、一度に約7つのリクエストを送信しますが、キューは代わりにそれらを連続して実行しますこれにより、ネットワーク帯域幅の問題を防ぐことができます

于 2011-07-17T19:23:47.520 に答える