从块中获取价值(iOS 5)

时间:2012-03-16 11:10:11

标签: ios

我想将此方法返回到数组,但块的值总是为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; }

3 个答案:

答案 0 :(得分:2)

操作异步执行;但是你要同步返回array。操作的成功块将在不确定的时间执行;但是return语句会在[operation start]之后立即执行。

另一个问题: (1)您没有为操作提供故障阻止;所以如果请求失败,你就不会知道。

首先尝试在成功块中记录JSON。确认您正在获取有效数据(并且请求成功。)如果没有,请提供故障块并查看故障是什么。

但最重要的是,您必须重新设计此API,以说明AFNetworking API是异步的。

答案 1 :(得分:1)

大概JSONRequestOperationWithRequest:是异步的,这意味着成功块将在 NSLog语句之后执行。

答案 2 :(得分:0)

您可以将调用发送getFoods消息的对象指定为具有getFoods方法的类的委托方法。然后在AFJSON成功块中执行以下操作:

[delegate didReceiveJSON:JSON];

当然,您必须定义委托协议和方法。