NSURLConnection同步问题

时间:2010-12-28 16:54:53

标签: objective-c

我正在编写一个iPhone应用程序,它将使用soap消息格式调用webservice方法。 我需要一个同步过程,因为表视图需要这些数据才能显示。 所以我使用[NSURLConnection sendSynchronousRequest:returningResponse:error:]

问题是,在方法调用之后整个程序将退出而没有任何错误消息。 即使我在之后放了一个NSLog语句 [NSURLConnection sendSynchronousRequest:returningResponse:error:], 没有任何输出,所以我确信程序在该方法调用期间退出。实际上在期间 那个HTTP请求和响应的东西。

但是,如果我在该方法调用之前设置了断点,并在调试模式下运行该程序, 一切运行良好,程序不会退出,我也得到了我的结果。

任何人都可以弄清楚发生了什么事吗? 感谢。

- (void) sendSyncHTTPRequest:(NSString *)request_data operation:(ServOperationSync *)serv_ops { 
id<ServiceData> serv_data = serv_ops.dataDelegate;
NSURL *urlAddr = [NSURL URLWithString:[serv_data getServURL]];

urlRequest = [NSMutableURLRequest requestWithURL:urlAddr
                                     cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                 timeoutInterval:90];
NSData *requestData = [request_data dataUsingEncoding:NSUTF8StringEncoding];
[urlRequest setValue:@"MobilePortal" forHTTPHeaderField:@"User-Agent"];
[urlRequest setValue:[serv_data getSoapAction] forHTTPHeaderField:@"SOAPAction"];
[urlRequest setValue:[NSString stringWithFormat:@"%u", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[urlRequest setValue:urlAddr.host forHTTPHeaderField:@"Host"];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:requestData];

NSLog(@"just before sending http request");
[serv_ops.responseData setData:[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&urlError]];
NSLog(@"after sending http request");

}

请注意,urlResponse和urlError被声明为实例变量。

2 个答案:

答案 0 :(得分:3)

您没有提供足够的代码来找出您的应用无法正常运行的原因。

使用[NSURLConnection sendSynchronousRequest:returningResponse:error:]通常是一个坏主意,因为它会阻止当前线程。您可能正在从主线程调用它,这将阻止UI。当请求需要很长时间时(特别是在像EDGE这样的低带宽连接上),应用程序不会响应触摸并感觉像冻结一样。

网络的本质是异步的。所以我建议您改为发出异步请求或使用GCD。在委托方法中更新Tableview(连接:didReceiveData:等)。您可以将tableview数据保存在NSMutableArray中,并在修改数组后调用[tableView reloadData]。然后将从UITableViewDataSource委托方法中的该数组构建tableview。

答案 1 :(得分:0)

你需要:

  • 代码上的运行循环
  • 并且不要忘记您的NSURLConnection 代表