4

Web 服务需要做什么才能使NSURLConnection's委托接收connection:didFailWithError:消息?

例如:iOS 应用程序将令牌传递给 Web 服务,Web 服务查找该令牌,然后 Web 服务需要以“无效令牌”之类的错误进行响应。

当前,接收到数据,并在“ connectionDidFinishLoading:”中解析错误消息。这意味着我在两个地方检查错误,这是我试图避免的。

我完全可以控制 iOS 应用程序和 Web 服务。

4

4 回答 4

5

根据我的经验(编程中最危险的三个词),-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;
}
于 2012-05-01T18:46:40.107 回答
1

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"); 
} 
于 2012-05-11T13:19:10.450 回答
0

虽然与您的问题没有直接关系,但我鼓励您转向更高级别的库。我可以衷心推荐 AFNetworking,它已准备好生产并且我已经在许多项目中使用它。这将允许您检查失败块中每个请求的响应代码。该项目还抽象出许多您原本需要为网络通信编写的低级处理;我在这里谈论的是解析和创建 XML/JSON 字符串以与服务进行通信。

为了给您一个更集中的问题答案,cancel一旦您注意到connectionDidFinishLoading:. 这将自动取消请求并调用委托对象的失败方法。

NSURLConnection 的文档非常枯燥,委托的失败方法并没有专门记录失败的情况。您可以在URL 加载系统编程指南中找到更多信息。

于 2012-05-07T13:53:48.650 回答
0

我看不到森林的树木。

我需要退后一步connection:didFailWithError:,看看不同的委托方法connection:didReceiveResponse:

在我完全控制 Web 服务的情况下,端点可以响应 500 状态代码,该代码在 中获取connection:didReceiveResponse,并传递一些 JSON 进一步解释情况,该状态代码在 中获取和处理connection:didReceiveData:

NSURLConnection 委托在整个过程中会挂起更多的状态,但它具有我迄今为止发现的最好的代码气味。

Jeffery 的回答是迄今为止最正确的:connection:didFailWithError:回调仅与网络故障有关,来自 Web 服务的任何响应都意味着连接没有失败!

于 2013-01-12T00:09:32.800 回答