从一个块返回 - 目标C.

时间:2015-07-08 09:02:16

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

我有一个包含AFNetworking块的类方法,其中我想返回一个字典变量,代码如下所示:

+(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;
}

如何在这里返回resultArray,由于控制流程的不同,它在此处不返回任何内容。

我对Objective C块没有多少了解。等待你的帮助。

谢谢。

3 个答案:

答案 0 :(得分:2)

使用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);
 }];

<强>更新 删除了使用的额外数组。

希望这有帮助。

答案 1 :(得分:1)

网络调用本质上是异步的,因此使用此方法返回其结果可能不是正确的思考方式,因为它意味着您进行同步网络调用。

让方法改为使用块参数,并在稍后的时间点从AFNetworking完成块执行该块的结果。

答案 2 :(得分:0)

在获得GET调用的响应之前,它将执行下一行。这就是为什么你没有数据进入Array。

您可以在成功和失败块中调用委托方法。这是最好的解决方案。