从街区返回 - Objective C
Returning from a block - Objective C
我有一个包含 AFNetworking
块的 class 方法,我想在其中 return 一个字典变量,代码如下所示:
+(NSMutableDictionary*) getFromUrl:(NSString*)url parametersPassed:(NSDictionary*)parameters;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
__block NSMutableDictionary *resultarray;
[manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
NSMutableDictionary *resultarrayTwo = (NSMutableDictionary *)responseObject;
resultarray = resultarrayTwo;
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@, %@", error, operation.responseString);
UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Message" message:@"Try again" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alertView show];
}];
return resultArray;
}
我怎么能 return resultArray 这里,return这里什么都没有,因为控制流的不同。
我对Objective C块了解不多。等待您的帮助。
谢谢。
网络调用本质上是异步的,因此使用此方法return其结果可能不是正确的思考方式,因为它暗示您进行同步网络调用。
让该方法采用一个块参数,并在稍后的时间点从 AFNetworking 完成块中使用结果执行该块。
在获取 GET 调用的响应之前,它将执行下一行。这就是为什么您没有将数据输入 Array 的原因。
您可以在成功和失败块中调用委托方法。这是最好的解决方案。
使用Completion Blocks
将您的函数设计更改为以下函数
+(void)getFromUrl:(NSString*)url parametersPassed:(NSDictionary*)parameters completion:(void (^) (NSMutableArray *values))completion;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
NSMutableDictionary *resultarray = (NSMutableDictionary *)responseObject;
completion(resultarray);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@, %@", error, operation.responseString);
UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Message" message:@"Try again" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alertView show];
completion(nil);
}];
}
并调用函数
[YourClass getFromUrl:url parametersPassed:params completion:^(NSMutableArray *values) {
NSLog(@"%@",values);
}];
更新
删除了使用的额外数组。
希望对您有所帮助。
我有一个包含 AFNetworking
块的 class 方法,我想在其中 return 一个字典变量,代码如下所示:
+(NSMutableDictionary*) getFromUrl:(NSString*)url parametersPassed:(NSDictionary*)parameters;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
__block NSMutableDictionary *resultarray;
[manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
NSMutableDictionary *resultarrayTwo = (NSMutableDictionary *)responseObject;
resultarray = resultarrayTwo;
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@, %@", error, operation.responseString);
UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Message" message:@"Try again" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alertView show];
}];
return resultArray;
}
我怎么能 return resultArray 这里,return这里什么都没有,因为控制流的不同。
我对Objective C块了解不多。等待您的帮助。
谢谢。
网络调用本质上是异步的,因此使用此方法return其结果可能不是正确的思考方式,因为它暗示您进行同步网络调用。
让该方法采用一个块参数,并在稍后的时间点从 AFNetworking 完成块中使用结果执行该块。
在获取 GET 调用的响应之前,它将执行下一行。这就是为什么您没有将数据输入 Array 的原因。
您可以在成功和失败块中调用委托方法。这是最好的解决方案。
使用Completion Blocks
+(void)getFromUrl:(NSString*)url parametersPassed:(NSDictionary*)parameters completion:(void (^) (NSMutableArray *values))completion;
{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
NSMutableDictionary *resultarray = (NSMutableDictionary *)responseObject;
completion(resultarray);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@, %@", error, operation.responseString);
UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Message" message:@"Try again" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alertView show];
completion(nil);
}];
}
并调用函数
[YourClass getFromUrl:url parametersPassed:params completion:^(NSMutableArray *values) {
NSLog(@"%@",values);
}];
更新 删除了使用的额外数组。
希望对您有所帮助。