2017-01-26 5 views
1

私は多くの完了ブロックを書きましたが、なぜこれが起こっているのかわかりません。適切な引数を指定してブロックを呼び出すと、ブロックベースの関数の制御は進まないはずです。しかし、私の場合はそうしています。iOS完了ブロックが制御を戻していない

- (void) validateFormWithCompletion: (void(^)(BOOL valid)) completion 
{ 
    if (! [NetworkConstant appIsConnected]) 
    { 
     [[AppThemeManager sharedInstance] showNoInternetMessage]; 

     completion(NO); 
    } 

    emailIdTF.text = [emailIdTF.text trimWhiteSpaceAndNextLine]; 

    if (emailIdTF.text.length == 0) 
    { 
     [[AppThemeManager sharedInstance] showNotificationWithTitle:@"Incomplete" subtitle:@"Please fill in a valid email id" duration:durationForTSMessage withTypeOfNotification:notificationWarning]; 

     completion(NO); 
    } 

    else 
    { 
     completion(YES); 
    } 
} 

インターネットに接続されていない場合、コントロールは最初の完了(NO)から戻る必要があります。しかし、代わりに電子メールの長さチェックに進む。私はここで何か間違っていますか?

答えて

3

ご質問がありましたら、returnを追加する必要があります。

if (! [NetworkConstant appIsConnected]) 
{ 
    [[AppThemeManager sharedInstance] showNoInternetMessage]; 

    completion(NO); 

    return; 
} 

returnは、ネットワーク接続が存在しない場合に実行されるの方法の残りを防止することができます。

完了ハンドラを使用する理由もないようです。メソッド内には非同期処理はありません。

+0

実際には、関数本体に非同期呼び出しがあります。私は短い投稿のためにそれを投稿しませんでした。私はすでにこれを防ぐためにリターンを追加しました。しかしこれは正しい行動ですか?私は1つの完了が遭遇した後、コントロールは前方に行くのですか? – Nil

+0

なぜそれは進まないのですか?補完ハンドラの呼び出しには魔法はありません。それは単なる関数呼び出しです。実行は他のコード行の後と同様に続きます。そのため、実行パスを変更するには、ここで 'return'が必要です。 – rmaddy

+0

ok。私はいつも使用していたと思うが、そうでなければ完了ブロックを持つブロックであれば、条件の1つだけが実行されたので、これに遭遇したことはない。早速のお返事ありがとうございます。 – Nil

0

補完ブロックを呼び出した他の時代は、非同期タスクによって呼び出された他の補完ブロック内に配置されていた可能性があります。したがって、補完ブロックを使用しても、あなたの例をどのように理解するのか分かりません。

- (BOOL) validateFormWithCompletion:(void(^)(BOOL valid)) completion 
{ 
    if (! [NetworkConstant appIsConnected]) { 
     [[AppThemeManager sharedInstance] showNoInternetMessage]; 

     return NO; 
    } 

    emailIdTF.text = [emailIdTF.text trimWhiteSpaceAndNextLine]; 

    if (emailIdTF.text.length == 0) { 
     [[AppThemeManager sharedInstance] showNotificationWithTitle:@"Incomplete" subtitle:@"Please fill in a valid email id" duration:durationForTSMessage withTypeOfNotification:notificationWarning]; 

     return NO; 
    } else { 
     return YES; 
    } 
} 
+0

私はこれに私の答えで触れました。私の答えに対する最初のコメントを見てください。 OPは、投稿されたコードが質問のために簡素化されていると述べている。 – rmaddy

関連する問題