1

我对 iOS 很陌生,正在尝试实现 HTTP 发布/获取通信的最佳方式。

问题:

我想进行多个 api 调用,每个调用都有其单独的响应。我正在尝试编写常见的网络工具,理想情况下它将使用 api url,进行调用并将数据返回给调用者。实现它的正确方法是什么?我发现每种方法都有中等程度的辩论和粉丝。

选项1:

 dispatch_async(aQueue,^{
    ...[ make a sync network request get data back]
    --- perform operation on data 
   --- then pass proceed data UI or set it in model. 

   dispatch_async(dispatch_get_main_queue()
  }

选项 2:

 -(NSString *) postData:(NSDictionary *)data serverUrl:(NSString *)targetUrl
   -- call post data method with seperate delegate for each caller 
   -- start async request 
   -- on DidFinishedLaunching or OnError check delegate & then 
      return response back to callback 

感谢您的投入。

4

2 回答 2

1

我认为您的第一个选择不好。它将长时间阻塞池化线程,这是不可取的。在任何环境中实现多线程时,系统提供的池线程不应用于长时间运行的进程。第二个同步网络调用并不真正被建议,它有它自己的陷阱。

您的第二个选项更可行。您可以做的一个改进是执行在确实完成启动到 GCD 线程中发生的工作,并在处理后在主线程上发送数据

于 2012-12-18T23:32:32.280 回答
1

有一个很棒的库,叫做AFNetworking,它很容易实现。

它使用块,这极大地简化了类之间的数据通信(取消了委托),并且是异步的。

示例用法如下:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:"www.yourwebsite.com/api"]];

NSDictionary *params = @{
    @"position": [NSString stringWithFormat:@"%g", position]
};

[client postPath:@"/api" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

就如此容易!Result 在调用 HTTP Post 或 Get 方法的类中直接可用。

它甚至包括图像和 JSON 请求、JSON 反序列化、带有进度回调的文件下载等等。

于 2012-12-18T23:03:27.390 回答