要使NSURLConnection's
委托接收connection:didFailWithError:
消息,网络服务需要做些什么?
例如: iOS应用程序将令牌传递给Web服务,Web服务查找令牌,然后Web服务需要响应“无效令牌”或类似内容的错误。
目前,收到数据,并在“connectionDidFinishLoading
:”中解析错误消息。这意味着我在两个地方进行错误检查,我试图避免这种情况。
我的iOS应用和网络服务完全由我控制。
答案 0 :(得分:5)
根据我的经验(编程中最危险的三个词),只有在HTTP交换失败时才会调用-connection:didFailWithError:
。这通常是网络错误或可能是身份验证错误(我不使用身份验证)。如果HTTP消息成功,则无论响应代码如何,都会调用-connectionDidFinishLoading:
。
我的解决方案:当我检测到错误时调用-connection:didFailWithError:
。这样我所有的错误处理代码都在一个地方。
在-connectionDidFinishLoading:
的顶部,我有:
NSError *error;
NSDictionary *result = [self parseResultWithData:self.connectionData error:&error];
if (!result) {
[self connection:connection didFailWithError:error];
return;
}
答案 1 :(得分:1)
委托连接有很多条件:didFailWithError:NSUrlConnection可以调用。这是errors or constants的列表。我认为警报视图最好在连接中显示http错误:didFailWithError:。
-(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error
{
UIAlertView *errorAlert= [[UIAlertView alloc] initWithTitle: [error localizedDescription] message: [error localizedFailureReason] delegate:nil cancelButtonTitle:@"Done" otherButtonTitles:nil];
[errorAlert show];
[errorAlert release];
NSLog (@"Connection Failed");
}
答案 2 :(得分:0)
虽然与您的问题没有直接关系,但我建议您转到更高级别的图书馆。我可以衷心地推荐AFNetworking,它已经准备就绪,我已经在许多项目中使用过它。这将允许您检查故障块中每个请求的响应代码。该项目还抽象了许多低级处理,否则您需要为网络通信编写;我在这里讲的是解析和创建XML / JSON字符串以与服务进行通信。
为了更准确地回答您的问题,我会在您注意到cancel
中的错误后调用NSURLConnection的connectionDidFinishLoading:
方法。这将自动取消请求并调用委托对象的失败方法。
NSURLConnection的文档非常干燥,代理的失败方法并未专门记录失败案例。您可以在URL Loading System Programming Guide。
中找到更多信息答案 3 :(得分:0)
我看不到树上的福雷斯。
我需要从connection:didFailWithError:
退一步,查看不同的委托方法connection:didReceiveResponse:
!!
在Web服务完全由我控制的情况下,端点可以使用500状态代码进行响应,该代码将在connection:didReceiveResponse
中获取,并传递一些JSON以进一步说明情况,该情况会被提取并处理connection:didReceiveData:
。
NSURLConnection委托在整个过程中会挂起几个状态,但它具有我迄今为止发现的最佳代码味道。
Jeffery's answer到目前为止最正确: connection:didFailWithError:
回调仅与网络失败有关,来自网络服务的任何响应都意味着连接没有失败!