我是iOS编程的新手。在我的测试应用程序中,我想从服务器下载一些xml数据并从中进行一些注释。它工作得很好,下一步我通过调度将其更改为异步。
一切都很好,但我不知道如何在这种情况下处理异常?如果服务器不可用,在哪里/如何处理?如果没有网络连接,在哪里/如何处理?何处/如何处理连接超时?
我的测试代码如下:
dispatch_queue_t downloadQueue = dispatch_queue_create("test data fetcher", NULL);
dispatch_async(downloadQueue, ^{
NSString* fetchedXML = [Fetcher getTestData:@"http://127.0.0.1:11111"];
dispatch_async(dispatch_get_main_queue(), ^{
NSArray *annotations = [TestAnnotation getFromXML:fetchedXML];
self.annotations = annotations;
});
});
dispatch_release(downloadQueue);
Fetcher的getTestData方法中最相关的部分
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
NSString *responseString = [[NSString alloc]initWithData:responseData encoding:NSUTF8StringEncoding];
提前致谢!
答案 0 :(得分:1)
您通过引用NSURLConnection的sendSynchronous选择器传递NSURLResponse和NSError。当此选择器返回时,将使用您之后的数据填充这些对象。
1)不要传递NSURLResponse,而是传递NSHTTPURLResponse,它是一个子类,允许您检查非200代码的HTTP状态代码(response.statusCode)。
2)检查sendSynchronous的返回值是否为nil,并检查NSError对象以获取有关错误情况的信息。这是出现超时和其他连接问题的地方。
答案 1 :(得分:1)
嗯,虽然这与您的问题没有直接关系,但您可以考虑使用NSURLConnection的内置异步请求工具,而不是使用dispatch_async(),使用+ sendAsynchronousRequest:queue:completionHandler:或 - initWithRequest:代表:
在您的情况下,从方法文档:
“如果无法创建连接或下载失败,则返回nil。”
所以,你会有一个成语,如:
if (responseData) {
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
}
else {
// Read error and handle appropriately. To see the error on the console, for example:
NSLog(@"%@", [error localizedDesription]);
}
要记住的主要事项(以及传入NSError **的所有其他情况)是从不首先读取错误值以查看是否发生了故障。您只有在被告知(在这种情况下,通过使用nil responseData)检查它时才会出现错误情况。
P.S.-在Objective-C中,“异常”特指程序员错误,因此使用“异常”来描述网络故障是不正确的。这只是预期在日常业务过程中处理的运行时错误。