ios - 为什么我的代码向后运行?或者看起来是这样?

标签 ios objective-c objective-c-blocks

我有一个 IBAction,当被调用时,它会向 Parse.com 注册用户信息...我只实现了电子邮件和用户名方法,因为我需要确保在提交之前服务器我添加了一个计数器 int,如果 counter == 2 它将执行注册...令我惊讶的是,当我运行代码时,它会运行倒过来,所以我在底部的条件语句甚至没有被审查,为什么会这样?

这是我的代码:

- (IBAction)signMeUpButton:(id)sender {
    [self.view endEditing:YES];
    counter = 0;



    user = [PFUser user];

    NSString *emailFromTextField = self.emailTF.text;

    if ([self isValidEmailAddress:emailFromTextField]) {


    [self emailHasBeenTaken:emailFromTextField completion:^(BOOL emailIsTaken, NSError *error) {
        if (error) {
            // TODO: handle any errors here
            return;
        }

        if (!emailIsTaken) {
            emailString = emailFromTextField;
            user.email = emailString;
            counter++;
            NSLog(@"The email is %@ the counter is %i", emailString, counter);

        }
        else {
            [self duplicateEmail];
        }
    }];


    }

    NSString *usernameFromTextField = self.usernameTF.text;
    if (usernameFromTextField.length >= 1) {
        [self usernameHasBeenTaken:usernameFromTextField completion:^(BOOL usernameIsTaken, NSError *error) {
            if (error) {
                return;
            }

            if (!usernameIsTaken) {
                usernameString = usernameFromTextField;
                user.username = usernameString;
                counter++;
                NSLog(@"The username is %@ and the counter is %i", usernameString, counter);
            }
            else {
                //
            }
        }];
    }

    if (counter == 2) {
        NSLog(@"Its working");
    }
}

这就是我运行它时在控制台上看到的内容,正如您所看到的,usernameHasBeenTaken 被首先调用,即使我将其写入第二...这是为什么?

2014-07-17 23:18:12.169 app[28210:60b] in the usernameHasBeenTaken. USERNAME IS NOT EXISTENT
2014-07-17 23:18:12.170 app[28210:60b] The username is sample and the counter is 1
2014-07-17 23:18:15.328 app[28210:60b] in the emailHasBeenTaken, EMAIL IS NOT EXISTENT
2014-07-17 23:18:15.328 app[28210:60b] The email is sample@email.com the counter is 2

这是我的 2 个方法:usernameHasBeenTakenemailHasBeenTaken

- (void)emailHasBeenTaken:(NSString *)email completion:(void(^)(BOOL emailIsTaken, NSError *error))completionBlock
{
    void (^completionCopy)(BOOL, NSError *) = [completionBlock copy];

    PFQuery *query = [PFUser query];
    [query whereKey:@"email" equalTo:email];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

        if (error) {
            NSLog(@"in the emailHasbeenTaken ERROR HAS OCCURRED");
            if (completionCopy) {
                completionCopy(NO, error);
            }
            return;
        }

        if (objects.count > 0) {
            NSLog(@"in the emailHasbeenTaken EMAIL IS DUPLICATE");
            if (completionCopy) {
                completionCopy(YES, nil);
            }
        }
        else {
            NSLog(@"in the emailHasBeenTaken, EMAIL IS NOT EXISTENT");
            if (completionCopy) {
                completionCopy(NO, nil);
            }
        }
    }];
}

- (void) usernameHasBeenTaken:(NSString *)username completion:(void(^)(BOOL usernameIsTaken, NSError *error))completionBlock
{
    void (^completionCopy)(BOOL, NSError *) = [completionBlock copy];
    PFQuery *query = [PFUser query];
    [query whereKey:@"username" equalTo:username];

    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (error) {
            NSLog(@"in the usernameHasBeenTaken ERROR HAS OCCURED");
            if (completionCopy) {
                completionCopy(NO, error);
            }
            return;
        }

        if (objects.count > 0) {
            NSLog(@"in the usernameHasBeenTaken USERNAME IS DUPLICATE");
            if (completionCopy) {
                completionCopy(NO, nil);
            }
        }
        else {
            NSLog(@"in the usernameHasBeenTaken. USERNAME IS NOT EXISTENT");
            if (completionCopy) {
                completionCopy(NO, nil);
            }
        }
    }];
}

最佳答案

您对完成 block 的使用表明您正在异步运行它们。如果是这种情况,那么在您调用 emailHasBeenTaken:completion:

后,您的密码条件会立即被触发

如果您必须运行异步(如果您正在访问 Web 服务,则应该这样做),则需要将您的调用嵌套在完成 block 中。

编辑

看来是这样的。 Parse API 异步运行,以避免锁定 UI 线程。您将需要嵌套您的回调,如下所示。

- (IBAction)signMeUpButton:(id)sender {
    [self.view endEditing:YES];
    counter = 0;



    user = [PFUser user];

    NSString *emailFromTextField = self.emailTF.text;

    if ([self isValidEmailAddress:emailFromTextField]) {


    [self emailHasBeenTaken:emailFromTextField completion:^(BOOL emailIsTaken, NSError *error) {
        if (error) {
            // TODO: handle any errors here
            return;
        }

        if (!emailIsTaken) {
            emailString = emailFromTextField;
            user.email = emailString;
            counter++;
            NSLog(@"The email is %@ the counter is %i", emailString, counter);

            NSString *usernameFromTextField = self.usernameTF.text;
            if (usernameFromTextField.length >= 1) {
                [self usernameHasBeenTaken:usernameFromTextField completion:^(BOOL usernameIsTaken, NSError *error) {
                    if (error) {
                        return;
                    }

                if (!usernameIsTaken) {
                    usernameString = usernameFromTextField;
                    user.username = usernameString;
                    counter++;
                    NSLog(@"The username is %@ and the counter is %i", usernameString, counter);
            }
            else {
                //
            }

            if (counter == 2) {
                NSLog(@"Its working");
            }
        }];
    }
        }
        else {
            [self duplicateEmail];
        }
    }];


    }
}

关于ios - 为什么我的代码向后运行?或者看起来是这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24816765/

相关文章:

objective-c - 需要桥接转换,尝试使用 CGPathRef 时出现不一致的警告

c# - 在 Xamarin.Mac 中注册服务

ios - 为什么我的应用程序包没有创建文件夹?

objective-c - Objective-C 中的递归 block 在 ARC 中泄漏

ios - 我什么时候应该使用 "performBlock"方法?

objective-c - 当同一个 block 被多次执行时,一个 block 中的 weakSelf 和 strongSelf 会发生什么?

ios - 将 UITextField 的 inputView 属性设置为在 Swift 中不起作用的 UIPicker

ios - 应用程序因 SecTrustEvaluate [leaf IssuerCommonName SubjectCommonName] 错误而卡住

ios - 我将如何为 iOS 应用程序构建和托管自己的后端?

objective-c - 如何在 iOS 上创建具有更高 dpi 的 PDF?