RestKit
すべてのリクエストが 1 つの関数を呼び出し、それが を介してリクエストをトリガーするように、 のラッパーを作成しようとしていますRestKit
。
これが私がこれまでに持っているものです:
関数は次のようにラッパーを呼び出します。
NSDictionary *response = [ラッパー sendRequestWithURLString:url メソッド:@"GET"];
そして私のラッパーメソッド:
+ (NSDictionary *)sendRequestWithURLString:(NSString *)request method:(NSString *)method
{
RKRequestDidFailLoadWithErrorBlock failBlock;
if ([method isEqualToString:@"GET"])
return [self sendGETRequestWithURLString:request withFailBlock:failBlock];
else if ([method isEqualToString:@"POST"])
return [self sendPOSTRequestWithURLString:request withFailBlock:failBlock];
return nil;
}
+ (NSDictionary *)sendGETRequestWithURLString:(NSString *)request withFailBlock:(RKRequestDidFailLoadWithErrorBlock)failBlock {
RKObjectManager *manager = [RKObjectManager sharedManager];
__block NSDictionary *responseDictionary;
[manager loadObjectsAtResourcePath:request usingBlock:^(RKObjectLoader *loader) {
loader.onDidLoadResponse = ^(RKResponse *response) {
[self fireErrorBlock:failBlock onErrorInResponse:response];
RKJSONParserJSONKit *parser = [RKJSONParserJSONKit new];
responseDictionary = [[NSDictionary alloc] initWithDictionary:[parser objectFromString:[response bodyAsString] error:nil]];
};
}];
return responseDictionary;
}
+ (void)fireErrorBlock:(RKRequestDidFailLoadWithErrorBlock)failBlock onErrorInResponse:(RKResponse *)response {
if (![response isOK]) {
id parsedResponse = [response parsedBody:NULL];
NSString *errorText = nil;
if ([parsedResponse isKindOfClass:[NSDictionary class]]) {
errorText = [parsedResponse objectForKey:@"error"];
}
if (errorText)
failBlock([self errorWithMessage:errorText code:[response statusCode]]);
}
}
+ (NSError *)errorWithMessage:(NSString *)errorText code:(NSUInteger)statusCode {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Please make sure you are connected to WiFi or 3G."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
return nil;
}
ここでの問題は、同時に実行されるため、まだ処理されていないresponseDictionary
ため、値が nil になることです。onDidLoadResponse
この場合、どのように設定するのが最善の方法でしょうresponseDictionary
か? 別のクラスのセッター メソッドを呼び出さないようにしています。この場合、デリゲートを使用する唯一のオプションは、RestKit 呼び出しが応答を返すためにデリゲート メソッドを使用する必要があるため、ラッパー クラスを作成するという目的全体を無効にしますか?
success
一部のローカル ivar を更新するブロックをラッパーに渡すことはできますか? どうすればいいですか?