从街区返回 - 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);
 }];

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

希望对您有所帮助。