0

ログイン試行情報を送信し、Web サービスからの応答を待ってURLRequest、ユーザーがログインできるかどうかを確認する を作成しています。

私がこれを行うことを望んでいた方法は、ユーザーにユーザー名とパスワードを 2 つのテキスト フィールドに入力させ、ボタンを押すことで、以下の関数を呼び出すことでした。この関数は を開始NSURLSessionDataTaskし、ブール値のログインの成功/失敗NSStringと、対応するエラー メッセージ (存在する場合) を含む構造体を構築します。

NSURLSessionDataTask's問題は、完了ブロックの実行が完了する前に関数が構造体を返すことです。このタスクがタイムアウトするか完了するまでプログラムを強制的に待機させる方法はありますか? または、関数が戻る前に、完了ブロックの実行をメインスレッドにプッシュできますか?

ありがとう!明確にする必要がある場合はお知らせください。

(また、GCD に言及している StackOverflow の周りで出回っている同様の質問を見たことがあります。これはやり過ぎの解決策ですか?これらの質問のどれも、まったく同じことについて話しているようには見えません。または、私の現在の理解よりも高いレベルで話しているようです。私はまだObjective-Cに非常に慣れていません)

- (struct RequestReport) sendLoginRequest: (NSString*) username withPassword:  (NSString *) password

... (リクエストの作成と HTTP ボディの設定)

NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){

    NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData: data options:0 error:nil];

    success = (BOOL)jsonObject[@"success"];
    statusText = (NSString *) jsonObject[@"errors"];

}];

[dataTask resume];

struct RequestReport rr;
rr.status = statusText;
rr.success = success;

return rr;
4

1 に答える 1

4

メソッドは次のようになります。

- (void) sendLoginRequest:(NSString*) username withPassword:(NSString *) password callback:(void (^)(NSError *error, BOOL success))callback
    {
    NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error){
        if (error) {
            // Handle error
        }
        else {
           callback(error, YES);
       }
  }];

    [dataTask resume];

}

このメソッドを次のように呼び出します。

[self sendLoginRequest:@"myUsername" password:@"password" callback:^(NSString *error, BOOL success) {
    if (success) {
         NSLog(@"My response back from the server after an unknown amount of time";
    }
}

ブロックの詳細についてはApple's Programming with Objective-Cを、ブロックの宣言方法についてはfuckingblocksyntax.comを参照してください。

于 2014-10-30T23:20:49.970 に答える