AFNetworking GET功能不会更改变量

时间:2015-11-12 21:44:39

标签: ios objective-c

我正在尝试使用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首先被执行。我不知道为什么会这样。谁可以帮我这个事?谢谢你。

1 个答案:

答案 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];

但是,如果响应未返回,则您的应用会挂起。