1

私はこの問題のクリーンな解決策を見つけるのに苦労してきましたが、正常に動作する複数の安らかな Web サービス要求を作成するアプリを作成しましたが、要求の一部でログインの詳細または API キーが期限切れになる可能性があり、できるようにする必要があります。これを処理し、ユーザーにログイン画面を再度表示します。

私の API クライアント クラスでは、正常に動作する次のことを行っていますが、アプリが複数の Web サービス リクエストを実行するため、UI AlertView が複数回表示されます。

このコード ブロックを、発生した最初のエラーに対して 1 回だけ実行し、アラート ビューを 1 つだけ表示する方法についてのアイデアはありますか?

    AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSInteger statusCode = [operation.response statusCode];

    if (statusCode == 401) {
           [UIAlertView error:@"Your session has expied, please log in again."];
           [[NSNotificationCenter defaultCenter]
            postNotificationName:@"Logout"
            object:self];
    } else {
        completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
    }
}];
4

2 に答える 2

1

1 つの方法は、現在のログイン ステータスを含むグローバル変数を作成することです。リクエストがチェーン化されていない場合は、リクエストの前、または成功/失敗のブロックの前に、このログイン ステータスを確認する必要があります。

より良いアプローチは、オブジェクトNSOperationQueueを管理するを作成することです。AFJSONRequestOperationこれにより、各リクエストの有効期間をより細かく制御できます。401 が返された場合、キュー内のすべての操作をキャンセルできます。

キューの作成と使用の詳細については、このリンクを参照してください。

于 2013-07-29T13:27:25.403 に答える