1

我有以下代码:

__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 循环打印输出,但第二个不打印。我错过了什么?

4

3 回答 3

2

您缺少对异步操作的理解。在您启动的操作完成之前,不会调用完成块。但是,NSLog 语句在消息发送到[API sharedInstance]-之后立即执行,results然后为 nil。

于 2012-09-19T19:30:59.573 回答
1

通常,完成处理程序表示异步请求。在这种情况下,commandWithParams:onCompletion:方法中的代码在执行之后的代码时还没有运行。

因此,您正在查看结果对象,但完成处理程序尚未运行以设置其值,因此它仍然为 nil。

于 2012-09-19T19:33:55.127 回答
0

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

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

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

于 2012-09-19T19:30:47.520 回答