0

NSURLConnection および NSURLConnectionDelegate プロトコルを使用して、iPhone クライアントから入力されたユーザー名とパスワードを含む URL をサーバーに投稿しています。サーバーが URL を受信すると、サーバー上で提供される Web サービスは、JSON 形式でいくつかのデータを取り込み、iPhone クライアントに送り返します。

私の WebserviceDelegate クラスは NSURLConnectionDelegate プロトコルを使用します。

    @implementation WebserviceDelegate

    - (id)initWithURL:(NSURL *)url
    {
        if (self = [super init])
        {
            responseData = [NSMutableData data];
            NSURLRequest *request = [NSURLRequest requestWithURL:url];

            connection = [NSURLConnection connectionWithRequest:request delegate:self];

            [connection start];
        }

        return self;
    }

    ...

    @end

ここで、サーバーから取得した応答が、ログインしているかどうかを示していることを確認したいと思います。これを行うために、Web サービスによって送信されるデータには、「ステータス」と呼ばれる辞書キーが含まれます。「status」が「true」の場合、ログインが成功したことを意味します。「false」が表示された場合は、ログインに失敗したことを意味します。

しかし、iPhone側では、上記のロジックを実装する方法がわかりません:

リクエストは非同期であるため、自己定義メソッドでステータス キーを確認しようとすると、null 値が返されます。(responseDict は .h ファイルで定義された変数であり、その値は

(void)接続:(NSURLConnection *)接続didReceiveData:(NSData *)データ

私の WebserviceDelegate クラスで)

    NSString *status = [responseDict objectForKey:@"status"];
    NSLog(@"status = %@", status);

    if ([@"true" isEqualToString:status]) {
        return YES;
    }
    else {
        return NO;
    }
4

1 に答える 1

0

これは、サーバーで実行している認証の種類によって異なります。

たとえば、基本http認証を使用している場合は、ヘッダーでクレデンシャルを簡単に送信でき、成功した場合は200のリターン、失敗した場合は4xxのリターンを期待できます。ここで説明するような他の種類の認証を行っている場合は、接続している限り、結果に関係なく200の応答が返されることを意味するため、辞書を読みます。

この場合、応答を待って次のことを実行する以外に方法はありません。たとえば、いくつかのアプローチを取ることができます。

デリゲートメソッドで実行したいことをすべて実行して、認証が成功した場合に、応答が到着したときに認証が実行されるようにします。

別のスレッドで同期リクエストを送信して、そこで次のタスクを実行することもできます。メインスレッドにないため、GUIをブロックすることはなく、ユーザーの認証にそれほど時間がかかることはないため、このスレッドにそれほど影響を与えることはありません。

(ただし、実行できる最も簡単な方法は、成功または失敗したパスをデリゲートメソッドから実行することです)

于 2012-08-14T06:47:28.037 に答える