【问题标题】:iOS completion block not returning controliOS完成块不返回控制
【发布时间】:2017-01-26 05:33:41
【问题描述】:

我写了很多完成块,但不知道为什么会这样。如果我们使用适当的参数调用块,则基于块的函数的控制不应该继续进行。但就我而言,它正在这样做。

- (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)返回;。但相反,它继续进行电子邮件长度检查。我在这里做错了吗?

【问题讨论】:

    标签: ios objective-c objective-c-blocks completionhandler


    【解决方案1】:

    如果我理解您的问题,您需要添加return

    if (! [NetworkConstant appIsConnected])
    {
        [[AppThemeManager sharedInstance] showNoInternetMessage];
    
        completion(NO);
    
        return;
    }
    

    如果没有网络连接,return 会阻止该方法的其余部分执行。

    似乎也没有理由使用完成处理程序。您的方法内部没有异步处理。

    【讨论】:

    • 其实函数体中有一个异步调用。我不是为了短篇而发布它。我已经添加了 return 来防止这种情况。但这是正确的行为吗?我的意思是在一次完成遭遇之后,控制继续前进??
    • 为什么不前进?调用完成处理程序没有什么神奇之处。这只是一个函数调用。执行就像在任何其他代码行之后一样继续执行。这就是为什么您需要在此处使用return - 来更改执行路径。
    • 好的。我想我一直使用 if,else if 带有完成块的块,这就是为什么只执行了一个条件而我从未遇到过这种情况。感谢您的快速回复。
    【解决方案2】:

    很可能在您调用完成块的其他时间,它们被放置在由异步任务调用的其他完成块中,但在给定示例中并非如此。因此,使用完成块对我如何理解您的示例没有意义。

    - (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;
        }
    }
    

    【讨论】:

    • 我在回答中提到了这一点。请参阅我的回答的第一条评论。 OP 在此处声明已针对该问题简化了发布的代码。
    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多