1

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 を更新するブロックをラッパーに渡すことはできますか? どうすればいいですか?

4

1 に答える 1

0

あなたが言ったように、あなたは成功ブロックを渡します。これを行う方法の例を次に示します。

.h

typedef void (^kServiceCompleteBlock)(NSDictionary* responseDictionary);

...
+ (NSDictionary *)sendGETRequestWithURLString:(NSString *)request withFailBlock:(RKRequestDidFailLoadWithErrorBlock)failBlock completion: (kServiceCompleteBlock) completion ;

...

.m

+ (NSDictionary *)sendGETRequestWithURLString:(NSString *)request withFailBlock:(RKRequestDidFailLoadWithErrorBlock)failBlock completion: (kServiceCompleteBlock) completion {

...

loader.onDidLoadResponse = ^(RKResponse *response) {

            [self fireErrorBlock:failBlock onErrorInResponse:response];

            RKJSONParserJSONKit *parser = [RKJSONParserJSONKit new]; 
            responseDictionary = [[NSDictionary alloc] initWithDictionary:[parser objectFromString:[response bodyAsString] error:nil]];

            if( completion )
               completion(responseDictionary);
        };

...

} 

ただし、潜在的な設計上の欠陥について警告させてください。UI が Web サービスではなくデータによって駆動されるように、アプリを設計する必要があります。これは、Web サービスが戻ったときではなく、データ モデルが更新されたときに UI が自動的に更新されることを意味します。この応答ディクショナリの使用方法に注意してください。UI を更新する場合は、危険な道を進んでいます。

于 2012-07-25T09:05:04.463 に答える