3

ユーザーが他のユーザーとそのアクティビティをフォローできるソーシャル ネットワーキング アプリを作成しています。

サーバー側では、各ユーザーは60 分後に有効期限が切れるトークンで識別されます。

トークンの有効期限が切れていて、ユーザーがメソッド- (void) followUserWithID:(NSNumber *)targetUserIDを呼び出したい場合、このメソッドは最初にautologinMethodを呼び出して(ユーザーのトークンが有効であることを確認するため)、繰り返します。- (void) followUserWithID:(NSNumber *)targetUserID

:追加の HTTP 要求を開始する「checkValidToken」要求は必要ありません。

-(void)commandWithParams:(NSMutableDictionary*)params command:(NSString *)command onCompletion:(JSONResponseBlock)completionBlock
{

    NSString *_path = [NSString stringWithFormat:@"%@%@",self.baseURL, command];
    NSLog(@"path: %@", _path );

    NSMutableURLRequest *apiRequest =
    [self multipartFormRequestWithMethod:@"POST"
                                    path:_path
                              parameters:params
               constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
                   //TODO: attach file if needed
               }];


    AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        //success!
        NSLog(@"%@",responseObject);

        completionBlock(responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //failure :(
        completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"ERROR"]);
        // Unable to establish a connection to the server.
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Server error"
                                                        message:@"Please try again later"
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
    }];

    [operation start];
}



- (void)followUserWithID:(NSNumber *)targetUserID
{
    NSNumber *ownID = [[NSUserDefaults standardUserDefaults] objectForKey:@"id"];
    NSMutableDictionary *HTTPPostDictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                               ownID, @"target_user_id",
                                               targetUserID, @"user_id",nil];

    [[WebAPI sharedInstance] commandWithParams:HTTPPostDictionary command:@"follow_user" onCompletion:^(NSDictionary *json){
        NSLog(@"%@", json);
    }];
}
4

1 に答える 1

2

必要がある

  1. AFNetworking 完了ブロックでトークンが有効かどうかを確認します
  2. トークンの有効期限が切れている場合は、トークンを更新してから操作を再試行してください

この場合、サーバーが提供する HTTP ステータス コードに応じて、チェックはsuccessまたはfailureブロックになります。

大まかな概要は次のとおりです。

if (/* the token has expired */) {
    AFHTTPRequestOperation *operationToRetryAfterTokenRenewal = [operation copy];

    //TODO: set the completion blocks for operationToRetryAfterTokenRenewal.

    [myTokenRenewer autologinMethodWithCompletionBlock:^{
                     [operationToRetryAfterTokenRenewal start];
                 }];


}

2 つの注意事項:

  1. TODO に注意してください。オブジェクトをコピーするAFHTTPRequestOperationと、完了ブロックは保持されないため、再度設定する必要があります。(詳細については、 AFURLConnectionOperation NSCopyingの警告を参照してください。)
  2. 特にファイルのアップロードを行う場合は、実際には[[myHTTPClient sharedClient] enqueueHTTPRequestOperation:operation]の代わりに使用する必要があります。[operation start]これにより、システムは一度に実行する操作の数を制御し、ネットワークの到達可能性が一時的に停止した場合に実行を遅らせることができます。
于 2013-06-19T15:51:11.720 に答える