【问题标题】:AFHTTPRequestOperationManager return data in blockAFHTTPRequestOperationManager 在块中返回数据
【发布时间】:2014-03-22 17:24:42
【问题描述】:

我在我的应用程序中创建了一个 APIController,它具有多个调用特定 api url 并返回填充了 api 调用结果的模型对象的方法。

该 api 与 json 一起使用,到目前为止,我的代码如下所示:

//Definition:
- (MyModel *)callXYZ;
- (MyModel *)callABC;
- (MyModel *)call123;

//Implementation of one:
- (MyModel *)callXYZ {

    //Build url and call with [NSData dataWithContentsOfURL: url];
    //Create model and assign data returned by api

    return model;

}

现在我想使用出色的 AFNetworking 框架来摆脱“dataWithContentsOfURL”调用。所以我改变了我的方法:

- (MyModel *)callXYZ {
    __block MyModel *m;
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //process data and assign to model m
    }
    return m;
}

此代码不起作用,因为在 url 调用完成之前返回了空模型。我被卡住了,不知道如何重构我的设计以使其正常工作。

//编辑:我不知道知道是否重要,但我稍后想在调用 api 时显示加载动画。

【问题讨论】:

  • 模型的接收与 http 请求异步进行。由于该方法当然会立即返回结果,因此它永远不会等待服务器的响应。这就是为什么您应该将模型返回到完成块的原因。

标签: objective-c afnetworking objective-c-blocks afnetworking-2 afhttprequestoperation


【解决方案1】:
- (void)callXYZWithCompletion:(void (^)(MyModel *model))completion {
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        MyModel *m;
        //process data and assign to model m

        if(completion) {
            completion(m);
        }
    }
}

使用示例:

// Start the animation

[self callXYZWithCompletion:^(MyModel *model) {
    // Stop the animation
    // and use returned model here
}];

【讨论】:

  • 谢谢!这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多