Ios 如何使webservice通过NSURLConnection传递错误';s连接:错误:?
web服务需要做什么才能使Ios 如何使webservice通过NSURLConnection传递错误';s连接:错误:?,ios,web-services,nsurlconnection,Ios,Web Services,Nsurlconnection,web服务需要做什么才能使NSURLConnection的委托接收connection:didfailwitheror:消息 例如: iOS应用程序将令牌传递给web服务,web服务查找令牌,然后web服务需要响应一个错误,称为“无效令牌”或类似的内容 当前,已接收数据,并在“connectiondFinishLoading:”中分析错误消息。这意味着我在两个地方进行错误检查,这是我试图避免的 我完全控制着iOS应用程序和web服务。根据我的经验(编程中最危险的三个词),-connection:
NSURLConnection的
委托接收connection:didfailwitheror:
消息
例如:
iOS应用程序将令牌传递给web服务,web服务查找令牌,然后web服务需要响应一个错误,称为“无效令牌”或类似的内容
当前,已接收数据,并在“connectiondFinishLoading
:”中分析错误消息。这意味着我在两个地方进行错误检查,这是我试图避免的
我完全控制着iOS应用程序和web服务。根据我的经验(编程中最危险的三个词),-connection:didFailWithError:
仅在HTTP交换失败时调用。这通常是网络错误或身份验证错误(我不使用身份验证)。如果HTTP消息成功,无论响应代码是什么,都会调用-connectiondifinishload:
我的解决方案:当我检测到错误时,调用-连接:didFailWithError:
。这样,我所有的错误处理代码都在一个地方
在我的-connectiondFinishLoading:
的顶部,我有:
NSError *error;
NSDictionary *result = [self parseResultWithData:self.connectionData error:&error];
if (!result) {
[self connection:connection didFailWithError:error];
return;
}
虽然与您的问题没有直接关系,但我鼓励您转到更高级别的库。我可以诚恳地推荐AFNetworking,它已经投入生产,我已经在许多项目中使用过它。这将允许您检查故障块中每个请求的响应代码。这个项目还抽象出了许多低层次的处理,否则您将需要编写网络通信;我在这里讲的是解析和创建XML/JSON字符串以与服务通信 为了给您的问题提供更集中的答案,一旦您注意到
connectiondFinishLoading:
中的错误,我将调用NSURLConnection的cancel
方法。这将自动取消请求并调用委托对象的failure方法
NSURLConnection的文档非常枯燥,委托的失败方法没有专门记录失败案例。您可以在中找到更多信息。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");
}
我看不见森林 我需要从
连接:didFailWithError:
后退一步,看看不同的委托方法连接:didReceiveResponse:
在web服务完全由我控制的情况下,端点可以响应500个状态代码,该代码在连接:didReceiveResponse
中获取,并传递一些JSON进一步解释情况,该代码在连接:didReceiveData:
中获取和处理
NSURLConnection委托在整个过程中会挂起更多的状态位,但它具有迄今为止我发现的最好的代码味道
是目前为止最正确的:连接:didFailWithError:回调仅与网络故障有关,来自web服务的任何响应都表示连接没有失败强> 第一个提到的<代码>连接在杰弗瑞的注释中应该是<代码>连接:DeDebug WiTrror:<代码>,对吗?我想得越多,我就越认为你可能是最正确的答案(虽然是一个明确的参考点)。代理回调是*connection:*didFailWithError:不是webService:didFailWithError:关于调用
-取消的有趣建议。文档说明:调用此方法后,连接的委托不再接收连接的任何消息。
这让我相信,-connection:didFailWithError:
不会被调用,尽管实际应用可能会出现不同的结果。谢谢,但问题是我需要做什么才能使我控制下的web服务触发didFailWithError:delegate回调。