我正在编写一个非常简单的Web服务客户端的应用程序。 我有以下问题: 1.是否有一种标准的通用方法来编写Web服务消耗部分,以便它不会干扰主GUI线程?通常的做法是使用主线程,考虑到Web请求应该花很短的时间来完成(但永远不知道)? 教程的任何链接? 2.我看到的所有示例都通过GET调用Web服务。我需要将数据发布到Web服务。 任何使用POST的已知样本/教程?
答案 0 :(得分:2)
如果您正在使用iPhone的内置Web请求API NSURLConnection,则可以在主线程上运行请求,但是您可以异步运行它,并在返回数据时回调委托。这使应用程序响应用户事件。如果返回数据的解析或处理在主线程上运行时间过长,则应在主线程上运行NSURLConnection,然后以递增方式或在下载完成后将响应数据传递给辅助线程以进行纯计算处理
可以在非主线程上启动NSURLConnections,但是您需要在非主线程上创建一个runloop,并且Apple库中存在随机线程安全错误的报告。如果您确实需要在非主线程上运行请求,则可以使用第三方库ASIHTTPRequest,但除非在非常特殊的情况下,否则您不需要这样做。
使用NSURLConnection生成POST请求非常简单:
NSString * requestBody = @"format up your body here, which is often form-urlencoded";
NSURL * nsurl = [NSURL URLWithString: @"http://example.com/post_request_receiver"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:nsurl];
// set appropriate content type here, usually application/x-www-form-urlencoded
[theRequest addValue: @"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: [NSString stringWithFormat:@"%d", [requestBody length]] forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [requestBody dataUsingEncoding:NSUTF8StringEncoding]];
conn = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];