如何通过NSURLConnection的连接使web服务传递错误:didFailWithError:?
Web服务需要做什么来使NSURLConnection's
委托接收connection:didFailWithError:
message?
例如:iOS应用程序将令牌传递给Web服务,Web服务查找令牌,然后Web服务需要以“无效令牌”或其他类似的错误进行响应。
目前,数据被接收,并在“ connectionDidFinishLoading
:”分析错误消息。 这意味着我错误检查两个地方,我试图避免。
我的iOS应用程序和Web服务完全在我的控制之下。
根据我的经验(编程中最危险的三个词),仅当HTTP交换失败时才会调用-connection:didFailWithError:
这通常是一个networking错误,或者可能是一个身份validation错误(我不使用身份validation)。 如果HTTP消息成功,则不pipe响应代码如何,调用-connectionDidFinishLoading:
我的解决scheme:调用-connection:didFailWithError:
当我检测到一个错误。 这样我所有的error handling代码都在一个地方。
在我的-connectionDidFinishLoading:
顶部,我有:
NSError *error; NSDictionary *result = [self parseResultWithData:self.connectionData error:&error]; if (!result) { [self connection:connection didFailWithError:error]; return; }
NSUrlConnection的委托连接: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,这是生产准备,我已经在很多项目中使用它。 这将允许您检查故障块中每个请求的响应代码。 这个项目也抽象了很多低级别的处理,否则你需要写networking通信; 我在这里讲解parsing和创buildXML / JSONstring来与服务进行通信。
为了给你一个更专注的回答你的问题,一旦你注意到connectionDidFinishLoading:
一个错误,我会调用NSURLConnection的cancel
方法。 这将自动取消请求并调用委托对象的失败方法。
NSURLConnection的文档非常干燥,委托的失败方法没有具体logging失败的情况。 您可以在URL加载系统编程指南中find更多信息。
我看不到那些树木。
我需要退出connection:didFailWithError:
并看看不同的委托方法connection:didReceiveResponse:
connection:didFailWithError:
在Web服务完全由我控制的情况下,端点可以响应一个500状态码,这个状态码可以connection:didReceiveResponse
,并传递一些JSON来进一步解释这个情况,它被connection:didReceiveData:
起来处理connection:didReceiveData:
NSURLConnection委托在整个过程中挂起了几个状态,但是它具有迄今为止我发现的最好的代码气味。
杰弗里的答案是最正确的: connection:didFailWithError:
callback只是相对于networking失败,从Web服务的任何响应意味着连接没有失败!