我想将此方法返回到数组,但块的值总是为nil ...
那么如何用块中的数据返回数组呢?块内的数据(JSON)有效。
+ (NSArray *)getFoods {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URL_FOOD]];
__block id array = [NSMutableArray array];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
array = JSON;
} failure:nil];
[operation start];
NSLog(@"%@", array);
return array; --> nil
为什么正常方式如此简单但阻挡方式有点困难?我改变了我的代码,并且在这种方法中不使用块:
+ (NSArray *)getFoods{
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:kFoodPlaceFoodsURL];
if (data != nil) {
NSDictionary *foods = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error) {
NSLog(@"%@", error.localizedDescription);
}
return [foods mutableCopy];
}
NSLog(@"No Data !!!");
return nil; }
答案 0 :(得分:2)
操作异步执行;但是你要同步返回array
。操作的成功块将在不确定的时间执行;但是return
语句会在[operation start]
之后立即执行。
另一个问题: (1)您没有为操作提供故障阻止;所以如果请求失败,你就不会知道。
首先尝试在成功块中记录JSON
。确认您正在获取有效数据(并且请求成功。)如果没有,请提供故障块并查看故障是什么。
但最重要的是,您必须重新设计此API,以说明AFNetworking
API是异步的。
答案 1 :(得分:1)
大概JSONRequestOperationWithRequest:
是异步的,这意味着成功块将在 NSLog
语句之后执行。
答案 2 :(得分:0)
您可以将调用发送getFoods消息的对象指定为具有getFoods方法的类的委托方法。然后在AFJSON成功块中执行以下操作:
[delegate didReceiveJSON:JSON];
当然,您必须定义委托协议和方法。