0

を使用して API と通信する iOS アプリを作成しようとしていますAFHTTPClient。最初のステップは、ユーザーを認証することです。そのために、次のコードを使用します。

-(void)authorize
{
    NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"login.php" parameters:@{@"login": account.username, @"passwd":account.password}];

    AFHTTPRequestOperation *operation = [httpClient HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [httpClient setDefaultHeader:@"Token" value:[[operation.response allHeaderFields] objectForKey:@"CSRF-Token"]];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@",error.localizedDescription);
    }];
    [httpClient enqueueHTTPRequestOperation:operation];
    [httpClient.operationQueue waitUntilAllOperationsAreFinished];
}

ご覧のとおり、私のコードはサーバーの応答からトークンを取得し、それを今後のすべての要求のデフォルト ヘッダーとして設定します。

次に、を使用して他のリクエストに進みます- (void)postPath:(NSString *)path parameters:(NSDictionary *)parameters success:success failure:failure

しかし、デバッガーを使用すると、承認操作が完了する前に他の要求が実行されたため、認証トークンがないために失敗したことがわかりました。追加しまし[httpClient.operationQueue waitUntilAllOperationsAreFinished];たが、うまくいかないようです...

ご協力ありがとうございました

4

1 に答える 1

2

ディスパッチ セマフォを使用します。

-(void)authorize
{
    dispatch_semaphore_t done = dispatch_semaphore_create(0);
    NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"login.php" parameters:@{@"login": account.username, @"passwd":account.password}];

    AFHTTPRequestOperation *operation = [httpClient HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [httpClient setDefaultHeader:@"Token" value:[[operation.response allHeaderFields] objectForKey:@"CSRF-Token"]];
        dispatch_semaphore_signal(done);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@",error.localizedDescription);
    }];
    [httpClient enqueueHTTPRequestOperation:operation];
    [httpClient.operationQueue waitUntilAllOperationsAreFinished];
    dispatch_semaphore_wait(done, DISPATCH_TIME_FOREVER);
}

これにより、メソッドが戻るのがブロックされるため、メイン/UI スレッド上にないことを確認する必要があることに注意してください。

于 2013-02-17T20:34:36.940 に答える