我有以下代码:
__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循环打印输出,但第二个不打印输出。我错过了什么?
答案 0 :(得分:2)
你错过了对asynch操作的理解。在您启动的操作完成之前,不会调用完成块。但是,NSLog语句在消息发送到[API sharedInstance]
后立即执行 - 而results
则为零。
答案 1 :(得分:1)
通常,完成处理程序指示异步请求。在这种情况下,commandWithParams:onCompletion:
方法中的代码在执行后的代码中将不会运行。
所以,你正在查看结果对象,但是还没有运行完成处理程序来设置它的值,所以它仍然是零。
答案 2 :(得分:0)
问题很可能是您的commandWithParams:onCompletion:
方法是异步的。也就是说,它被分派到另一个线程上。
我认为这是一个网络调用,因为它看起来像,但这适用于任何异步方法。基本上它是在后台下载您的数据,这样您就不会冻结应用程序。
那么这对您的代码意味着什么?好吧,你创建一个未初始化的指向NSDictionary的指针。然后,您要求API类的共享实例为您分派网络请求。然后立即在调度请求之后,很可能在网络请求/长时间运行的进程完成之前,执行下一行代码,这恰好是你的for循环。