我正在尝试使用AFNetworking类从数据库中检索数据。长话短说,从参数responseObject
收到的数据充满了项目。不过这是我的问题。我正在尝试将responseObject
中的结果复制到名为NSDictionary
的{{1}}中。我使用以下代码来实现目标:
results
我尝试__block NSDictionary *results;
[manager GET:@"http://daneolog.altervista.org/app/getData.php"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) { results = responseObject;
NSLog(@"Inside: %@", results); }
failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }];
NSLog(@"Outside: %@", results);
NSLog
字典 INSIDE 成功支持,一切都还可以。
我尝试results
NSLog
字典 OUTSIDE GET函数,它出现为(null)。
这些是我的结果:
results
现在注意一下特殊的事情:外部NSLog首先被执行。我不知道为什么会这样。谁可以帮我这个事?谢谢你。
答案 0 :(得分:2)
成功块之外的代码在成功块完成之前执行,这就是results
出现null
的原因。 results
位于主线程上,并且您没有阻塞(正如HTTP请求一样)。
您可以将弱引用传递给对象,并将其更新。或者,如果您绝对需要等待结果(例如登录),那么您应该在主线程上执行此操作。
以下是弱对象的示例:
//results is an object created earlier
__weak NSDictionary *weakResults = results;
[manager GET:@"http://daneolog.altervista.org/app/getData.php"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
weakResults = responseObject;
NSLog(@"Inside: %@", results);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
}];
//when the success block finishes the results object will be populated
如果您想阻止,即在主线程上执行此操作,您可以使用:
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
但是,如果响应未返回,则您的应用会挂起。