NSMutableDictionary的值在块内没有变化

时间:2014-12-29 11:45:07

标签: ios objective-c objective-c-blocks

我在此方法中传递URL并将数据作为输出。我想为nsmutabledictionary分配一个新值,但它没有赋值。

-(NSDictionary*) getDatafromURL: (NSString*)url{

    __block NSMutableDictionary *returnData=[[NSMutableDictionary alloc] init];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

        returnData=(NSMutableDictionary*)responseObject;
        NSLog(@"Data 1: %@",returnData);// it is printing the data

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    NSLog(@"Data 2: %@",returnData);//  it is not printing any data

    return returnData;
}

在上面的示例中,数据1显示成功值

数据2给我空字典。为什么不分配新值?

2 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为你接受了#34;数据2"首先,该块仅在之后执行,因为它是异步请求。我建议您将方法更改为:

- (void)getDataFromURL:(NSString *)url completionHandler:(void (^)(NSMutableDictionary *returnData, NSError *error))handler {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        returnData=(NSMutableDictionary*)responseObject;
        NSLog(@"Data 1: %@",returnData);// it is printing the data
        handler(returnData, nil);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        handler(nil, error);
    }];
}

我提供的代码中可能存在一些编译错误。

另一个解决方案是执行同步请求,在这种情况下,块将在块之后的代码之前执行。

修改

如果您选择第一个解决方案,则必须以异步方式继续使用它。所以你会这样称呼:

[self getDataFromURL:@"abc.com" completionHandler:^ (NSMutableDictionary *returnData, NSError *error) {
    // process your dictionary and the error object
}];

答案 1 :(得分:1)

请检查数据2是否在数据1之前打印?如果是,那是因为,响应对象仅在一定延迟后才下载。拿走退货声明。将数据传递给返回方法的字典。例如:喜欢

而不是     self.myDictionary = [self getDatafromURL:someURl];

-(void) getDatafromURL: (NSString*)url{

    __block NSMutableDictionary *returnData=[[NSMutableDictionary alloc] init];
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    returnData=(NSMutableDictionary*)responseObject;
    NSLog(@"Data 1: %@",returnData);// it is printing the data
    self.myDictionary = returnData;

    // Continue whatever you want to do

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

或者使用调度方法而不是块。 像

或者使用下面的经理waitUntilFinish方法。