最近、ASIHttpRequestライブラリからAFNetworkingに切り替えました。私はそのシンプルさが本当に好きですが、非同期コードを構造化する方法を理解するのにまだ苦労しています。
このサインアップシナリオを検討してください。
- まず、入力したメールアドレスが利用可能かどうかを確認したいと思います。
- 次に、入力したユーザー名が使用可能かどうかを確認します。
- 上記の両方が有効で利用可能な場合は、実際のサインアップリクエストを送信します。
私のコードは次のようになります。
- (void)signUp{
BOOL hasValidEmail = [self validateEmail:email];
BOOL hasValidUsername = [self validateUsername:username];
if(!hasValidEmail){
NSLog(@"Invalid email");
return;
}
if(!hasValidUsername){
NSLog(@"Invalid username");
return;
}
if (hasValidEmail && hasValidUsername) {
NSLog(@"Go ahead and create account");
}
}
ネットワークメソッドの非同期性を考慮すると、これをどのように構成するかはよくわかりません。多くの場合、前の2つの可用性チェックが応答を受け取る前に、最後の条件に到達します。
可用性チェックの方法は次のようになります。
- (BOOL)validateEmail:(NSString*)email{
__block NSString* emailAlreadyExists = @"";
NSString* url = [NSString stringWithFormat:@"user/emailexists/%@", email];
[[APIClient sharedClient] getPath:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
emailAlreadyExists = [responseObject valueForKey:@"exists"];
} failure:^(AFHTTPRequestOperation *operation, NSError* error) {
NSLog(@"Email availability check failed: %@", error.localizedDescription);
}];
if([emailAlreadyExists isEqualToString:@"true"]){
return NO;
}
return YES;
}
改善が必要なのは私のブロックスキルだけかもしれませんが、このようなシナリオをどのように構成するのか、本当に聞きたいですか?
コードサンプルは「素晴らしい」ものですが、私はあなたが知っているパターンや優れたテクニックを本当に探しています。
ありがとう。