我在此方法中传递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给我空字典。为什么不分配新值?
答案 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方法。