2

RestKitと同期してオブジェクトをロードしようとしていますが、これを[anObjectLoader sendSynchronously]バックグラウンドスレッドで使用しています。次に、RKObjectLoader didFinishLoadで:アプリケーションは現在最初の行で停止しています:ドキュメントNSAssert([NSThread isMainThread], @"RKObjectLoaderDelegate callbacks must occur on the main thread");

を見ると、クラスのメソッドは、要求が同期的に要求され、ハイドレイトされた応答オブジェクトが返されることを示しています。 これは私のコードのスナップショットです:sendSynchronouslyRKRequest

RKObjectLoader *anObjectLoader = [self.objectManager loaderWithResourcePath:resourcePath];
NSLog(@"Response: %@", [anObjectLoader sendSynchronously]);

コンソールの場合:

*** Assertion failure in -[RKManagedObjectLoader didFinishLoad:], ...RestKit/Code/ObjectMapping/RKObjectLoader.m:423

同期呼び出しでRestKitを使用しても大丈夫ですか?
同期リクエストを送信するためのより良い方法はありますか?
私は何かが足りないのですか?

4

2 に答える 2

2

同期呼び出しは絶対に行わないでください。メソッドを使用sendし、デリゲートまたはブロックコールバックのいずれかを使用して応答をキャッチします。特に、このメソッドはネットワーク帯域幅の使用に最適化されており、スレッド化も正しく処理します。

余談ですRKObjectLoaderが、メインスレッドが必要な理由は、メインオブジェクトのコンテキストがある場所だからです。

于 2012-08-07T07:57:50.423 に答える
1

私は最近これと同じ質問をしました。ブロックを使用して同期呼び出しを送信する方法を理解しましたが、実際には非常に便利です。基本的には、意図したレストキット呼び出しを実行しますが、デリゲートを自分自身に設定する代わりに、を使用しますusingBlock。次に、そのブロック内で、API呼び出しからのさまざまな応答を処理できます。

ブロックの例(APIUserは、現在のユーザーを表す、私が作成したクラスです):

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:userName] usingBlock:^(RKObjectLoader* loader) {

    loader.onDidLoadResponse = ^(RKResponse *response) {

        NSLog(@"Response: \n%@", [response bodyAsString]);
    };

    loader.onDidLoadObjects = ^(NSArray *objects) {

        APIUser *apiUser = [objects objectAtIndex:0];    

    };

    loader.onDidFailWithError = ^(NSError *error) {

        NSLog(@"Response: \n%@", [response bodyAsString]);          
    };
}];

私の元の質問と回答はここにあります

于 2012-08-08T16:17:28.183 に答える