2012-01-17 55 views
0

我是iOS编程的新手。在我的测试应用程序中,我想从服务器下载一些xml数据并从中进行一些注释。它工作的很好,作为下一步,我通过调度将它改为异步。在IOS5下异步下载数据时处理错误

一切正常,但我不知道如何处理这种情况下的异常?如果服务器不可用,在哪里/如何处理?在没有网络连接的情况下/如何处理?在哪里/如何处理连接超时?

我的测试代码如下所示:

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); 

特撷取的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

有第三方HTTP客户端库,使所有这些微不足道。 AFNetworking似乎是一种流行的选择(我以前最喜欢的,ASIHTTPRequest最近已弃用)。 – 2012-01-17 18:09:07

回答

1

您正在通过引用NSURLConnection的sendSynchronous选择器传递一个NSURLResponse和NSError。当这个选择器返回时,这些对象将填充你之后的数据。

1)不是通过NSURLResponse,而是通过NSHTTPURLResponse,它是一个允许您检查非200代码的HTTP状态代码(response.statusCode)的子类。

2)检查来自sendSynchronous的返回值是否为nil,并检查NSError对象以获取有关错误条件的信息。这是超时和其他连接问题将出现的地方。

+0

不,如我在回答中所述,您*不*检查NSError是否为非零。 *在没有错误情况存在的情况下,错误是未定义的。 – 2012-01-17 18:08:05

+0

是的,这是正确的。我编辑了我的答案以反映这一点。 – nickbona 2012-01-17 18:32:40

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 **传递在所有其他情况下)是你永远阅读错误首先看看是否发生故障。在被告知(在这种情况下,通过具有零响应数据)之后,您只会检查它是否出现了错误情况。

P.S.-在Objective-C中,“异常”特指程序员错误,所以使用“异常”来描述网络故障是不正确的。这只是一个预计在正常业务过程中处理的运行时错误。