从块内部进行回调(目标C)

安德鲁·SB

我有一个带有块的方法,我希望它在userID存在时立即将其发送给另一个方法。userID是从互联网解析的值,因此加载和“存在”通常需要2秒钟左右。有什么办法可以将'userID存在时,发送给另一种方法?
这是我所有的代码:

- (void)parseForUserID {
    //Get the Data you need to parse for (i.e. user main page returned as a block of NSData.
    TClient *client = [[TClient alloc] init];
    [client loginToMistarWithPin:@"20014204" password:@"yuiop" success:^{
        [client getUserID:^(NSString *result) {
            NSString *userIDWithHTML = [self userIDRegex:result];
            NSString *userID = [self onlyNumbersRegex:userIDWithHTML];

            //if userID exists, send it to another method in a different class

        }];
    } failure:^{
        NSLog(@"login failed from controller");
    }];
}
Merlevede

我看到这是您提出的与同一问题相关的第三个问题,因此我想您在理解块时遇到了一些麻烦。

首先,您必须了解该块在某种意义上可以看作是一个函数。区别在于,与函数不同,该块没有名称,并且无需使用函数名称,而只需将代码内联在需要的位置即可。

要了解的第二件事是,块通常用作回调其他回调机制是函数指针和委托。当您将块作为参数传递给函数时,您基本上是在告诉该函数:“嘿,当满足某些条件时,请为我执行这个小代码”

第三想理解的是,该块(或任何回调)是否将被同步调用其实这无关与块本身,本身,而是与被调用的函数。如果该函数是异步的,则该函数将创建另一个线程并立即返回以执行调用异步函数的那一行之后的下一行。同时,新线程将执行一些代码(异步函数的主体),并最终执行作为参数传递的块,最后该线程被杀死并且不再存在。注意:除了阅读该函数的文档之外,没有其他方法可以知道该函数是同步的还是异步的)。

现在,让我们回到您的代码。

[client loginToMistarWithPin:@"20014204" password:@"yuiop" success:^{
    [client getUserID:^(NSString *result) {
        NSString *userIDWithHTML = [self userIDRegex:result];
        NSString *userID = [self onlyNumbersRegex:userIDWithHTML];

        // PLACE HERE THE CODE TO EXECUTE WHEN SUCCESSFULLY LOGGED IN
        [anotherClassInstance someMethod:userID];

    }];
} failure:^{
    NSLog(@"login failed from controller");
}];

用户登录后应执行的所有操作均应放置在块内(如果功能是同步的,则可以将其放置在块后)。要将其发送userID到另一个类,只需在代码的任何其他部分中调用该类的方法即可。

我认为没有必要使用委托(尽管只有您会知道,因为您是应用程序的架构师)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章