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을 추가해야합니다. return

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

    completion(NO); 

    return; 
} 

가 네트워크에 연결되지 않은 경우에 실행되는 방법의 나머지를 방지한다.

완성 처리기를 사용할 이유가없는 것처럼 보입니다. 메소드 내부에는 비동기 처리가 없습니다.

+0

실제로 함수 본문에 비동기 호출이 있습니다. 나는 짧은 지위 때문에 그것을 게시하지 않았다. 나는 이것을 방지하기 위해 이미 수익을 추가했다. 그러나 이것이 올바른 행동입니까? 나는 한 번의 완료 만남 후에 통제가 앞으로 진행된다는 것을 의미합니까 ?? – Nil

+0

왜 앞으로 나아갈 수 없습니까? 완료 핸들러를 호출 할 때 마술은 없습니다. 함수 호출 일뿐입니다. 실행은 다른 모든 코드 행 다음과 동일하게 계속됩니다. 그래서 실행 경로를 변경하려면 여기에'return'이 필요합니다. – rmaddy

+0

확인. 나는 내가 항상 사용했다고 생각한다. 그렇지 않으면 완성 블록을 가진 블록 인 경우, 조건 중 하나만 실행되고 이것이 결코 발생하지 않는다. 빠른 답변 감사합니다. – 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