如何在iOS中从块中获取变量

时间:2012-09-19 19:25:58

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

我有以下代码:

__block NSDictionary *results;

if (username.length != 0 && password.length != 0) {
    NSMutableDictionary* params =[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  @"login", @"command",
                                  username, @"username",
                                  password, @"password",
                                  nil];

    [[API sharedInstance] commandWithParams:params onCompletion:^(NSDictionary *json) {
        for (id key in json) {

            NSLog(@"key: %@, value: %@", key, [json objectForKey:key]);
        }

        results = json;
    }];
}
for (id key in results) {

    NSLog(@"key: %@, value: %@", key, [results objectForKey:key]);

}

这个教程中的一些代码我试图用来解决一些问题。在本教程中,在'完成'部分完成了很多代码,我想让它返回NSDictionary,这样调用代码就可以自己处理结果。

我遇到的问题是没有设置结果。第一个NSLog for循环打印输出,但第二个不打印输出。我错过了什么?

3 个答案:

答案 0 :(得分:2)

你错过了对asynch操作的理解。在您启动的操作完成之前,不会调用完成块。但是,NSLog语句在消息发送到[API sharedInstance]后立即执行 - 而results则为零。

答案 1 :(得分:1)

通常,完成处理程序指示异步请求。在这种情况下,commandWithParams:onCompletion:方法中的代码在执行后的代码中将不会运行。

所以,你正在查看结果对象,但是还没有运行完成处理程序来设置它的值,所以它仍然是零。

答案 2 :(得分:0)

问题很可能是您的commandWithParams:onCompletion:方法是异步的。也就是说,它被分派到另一个线程上。

我认为这是一个网络调用,因为它看起来像,但这适用于任何异步方法。基本上它是在后台下载您的数据,这样您就不会冻结应用程序。

那么这对您的代码意味着什么?好吧,你创建一个未初始化的指向NSDictionary的指针。然后,您要求API类的共享实例为您分派网络请求。然后立即在调度请求之后,很可能在网络请求/长时间运行的进程完成之前,执行下一行代码,这恰好是你的for循环。