我正在编写一个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被声明为实例变量。
答案 0 :(得分:3)
您没有提供足够的代码来找出您的应用无法正常运行的原因。
使用[NSURLConnection sendSynchronousRequest:returningResponse:error:]
通常是一个坏主意,因为它会阻止当前线程。您可能正在从主线程调用它,这将阻止UI。当请求需要很长时间时(特别是在像EDGE这样的低带宽连接上),应用程序不会响应触摸并感觉像冻结一样。
网络的本质是异步的。所以我建议您改为发出异步请求或使用GCD。在委托方法中更新Tableview(连接:didReceiveData:等)。您可以将tableview数据保存在NSMutableArray
中,并在修改数组后调用[tableView reloadData]
。然后将从UITableViewDataSource
委托方法中的该数组构建tableview。
答案 1 :(得分:0)
你需要: