ログイン試行情報を送信し、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;