2

Restkit を使用して、AppDelegate で RKObjectManager をセットアップしましたが、すべて正常に動作しています。特定の応答コードに対してデフォルトのアクションを設定する方法があるかどうか知りたいです。

たとえば、ユーザーが iPhone アプリを使用して API にログインし、使用する auth_token を取得します。任意の時点で、任意の要求に対して 403 応答が返された場合 (auth_token の有効期限が切れた場合など)、RootViewController をログイン画面に変更したいと考えています。

アプリでこれを設定する最良の方法は何ですか?

4

2 に答える 2

3

RestKit 0.20 では、あなたの を登録できるRKObjectRequestOperationので、すべてのリクエスト/レスポンスを、何よりも先に独自の成功/失敗ブロックに渡すことができます。

http://blog.higgsboson.tk/2013/09/03/global-request-management-with-restkit/

#import "RKObjectRequestOperation.h"

@interface CustomRKObjectRequestOperation : RKObjectRequestOperation

@end

@implementation CustomRKObjectRequestOperation

- (void)setCompletionBlockWithSuccess:(void ( ^ ) ( RKObjectRequestOperation *operation , RKMappingResult *mappingResult ))success failure:(void ( ^ ) ( RKObjectRequestOperation *operation , NSError *error ))failure
{
    [super setCompletionBlockWithSuccess:^void(RKObjectRequestOperation *operation , RKMappingResult *mappingResult) {
        if (success) {
            success(operation, mappingResult);
        }

    }failure:^void(RKObjectRequestOperation *operation , NSError *error) {

        [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFailure" object:operation];

        if (failure) {
            failure(operation, error);
        }

    }];
} 

@end

次に、サブクラスを登録します。

[[RKObjectManager sharedManager] registerRequestOperationClass:[CustomRKObjectRequestOperation class]];

上記で送信している「connectionFailure」をリッスンします。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionFailedWithOperation:) name:@"connectionFailure" object:nil];

リスナー (例: AppDelegate またはログイン マネージャー) で:

- (void)connectionFailedWithOperation:(NSNotification *)notification
{
    RKObjectRequestOperation *operation = (RKObjectRequestOperation *)notification.object;
    if (operation) {

        NSInteger statusCode = operation.HTTPRequestOperation.response.statusCode;

        switch (statusCode) {
            case 0: // No internet connection
            {
            }
                break;
            case  401: // not authenticated
            {
            }
                break;

            default:
            {
            }
                break;
        }
    }
}
于 2014-06-05T09:08:53.537 に答える
1

RestKit 0.10 を使用する場合、指定されたデリゲート メソッドを使用できますobjectLoaderDidLoadUnexpectedResponse

- (void)objectLoaderDidLoadUnexpectedResponse:(RKObjectLoader *)objectLoader {
    if ([[objectLoader response] statusCode] == 403) {
        // Your action here
    }
}

RestKit 0.20 では、単一のコードまたは一連のコードに対して応答記述子を使用できます。

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping 
                                                                                   pathPattern:nil 
                                                                                       keyPath:@"yourKeyPath" 
                                                                                   statusCodes:[NSIndexSet indexSetWithIndex:403]];

ドキュメントのその他のステータス コード セット。

アップデート

他のView Controllerの1つで行われたリクエストのエラーを処理するためにBaseViewControllerを使用する場合、通知を設定できます。

BaseViewController

- (void)viewDidLoad 
{
    // ...

    // Set observer for notification e.g. "requestFailedWith403Error"
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handle403Error:) name:@"requestFailedWith403Error" object:self];
}

- (void)handle403Error:(NSNotification)notification 
{
    // Code for handling the error 
}

SubViewController

- (void)loginToServer 
{
    // ...

    // Set authorization header
    [[RKObjectManager sharedManager].HTTPClient setAuthorizationHeaderWithUsername:@"username" password:@"password"];

    // e.g. POST to server
    [[RKObjectManager sharedManager] postObject:yourObject
                                       path:@"path/toserver"
                                 parameters:nil
                                    success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                                        // Handling success
                                    } failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                        // Handling error with notification
                                        [[NSNotificationCenter defaultCenter] postNotificationName:@"requestFailedWith403Error" object:self];
    }];
}

エラーの処理で中央構成を最適化するには、 RestKit Wiki (エラー マッピングが追加されている場所)にあるサンプル コードをもう一度見てください。

于 2013-04-08T17:37:18.940 に答える