Web 服务需要做什么才能使NSURLConnection's
委托接收connection:didFailWithError:
消息?
例如:iOS 应用程序将令牌传递给 Web 服务,Web 服务查找该令牌,然后 Web 服务需要以“无效令牌”之类的错误进行响应。
当前,接收到数据,并在“ connectionDidFinishLoading
:”中解析错误消息。这意味着我在两个地方检查错误,这是我试图避免的。
我完全可以控制 iOS 应用程序和 Web 服务。
Web 服务需要做什么才能使NSURLConnection's
委托接收connection:didFailWithError:
消息?
例如:iOS 应用程序将令牌传递给 Web 服务,Web 服务查找该令牌,然后 Web 服务需要以“无效令牌”之类的错误进行响应。
当前,接收到数据,并在“ connectionDidFinishLoading
:”中解析错误消息。这意味着我在两个地方检查错误,这是我试图避免的。
我完全可以控制 iOS 应用程序和 Web 服务。
根据我的经验(编程中最危险的三个词),-connection:didFailWithError:
只有在 HTTP 交换失败时才会调用。这通常是网络错误或身份验证错误(我不使用身份验证)。如果 HTTP 消息成功,则无论响应代码如何,-connectionDidFinishLoading:
都会被调用。
我的解决方案:-connection:didFailWithError:
当我检测到错误时调用。这样我所有的错误处理代码都在一个地方。
在我的顶部-connectionDidFinishLoading:
,我有:
NSError *error;
NSDictionary *result = [self parseResultWithData:self.connectionData error:&error];
if (!result) {
[self connection:connection didFailWithError:error];
return;
}
NSUrlConnection 的委托 connection:didFailWithError: 可能会调用很多条件。这是这些错误或常量的列表。我认为 alertview 会更好地显示连接中的 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");
}
虽然与您的问题没有直接关系,但我鼓励您转向更高级别的库。我可以衷心推荐 AFNetworking,它已准备好生产并且我已经在许多项目中使用它。这将允许您检查失败块中每个请求的响应代码。该项目还抽象出许多您原本需要为网络通信编写的低级处理;我在这里谈论的是解析和创建 XML/JSON 字符串以与服务进行通信。
为了给您一个更集中的问题答案,cancel
一旦您注意到connectionDidFinishLoading:
. 这将自动取消请求并调用委托对象的失败方法。
NSURLConnection 的文档非常枯燥,委托的失败方法并没有专门记录失败的情况。您可以在URL 加载系统编程指南中找到更多信息。
我看不到森林的树木。
我需要退后一步connection:didFailWithError:
,看看不同的委托方法connection:didReceiveResponse:
!
在我完全控制 Web 服务的情况下,端点可以响应 500 状态代码,该代码在 中获取connection:didReceiveResponse
,并传递一些 JSON 进一步解释情况,该状态代码在 中获取和处理connection:didReceiveData:
。
NSURLConnection 委托在整个过程中会挂起更多的状态,但它具有我迄今为止发现的最好的代码气味。
Jeffery 的回答是迄今为止最正确的:connection:didFailWithError:
回调仅与网络故障有关,来自 Web 服务的任何响应都意味着连接没有失败!