0
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{

    NSDictionary * dictionary = nil;
    NSError * returnError = nil;
    NSString * errorCode = nil;
    NSString * errorText = nil;
    NSInteger newErrorCode = 0;

    if([data length] >= 1) {
        dictionary = [NSJSONSerialization JSONObjectWithData: data options: 0 error: nil];
    }

    if(dictionary == nil) {

        newErrorCode = -1;
        errorText = @"There was an unexpected error.";
        NSMutableDictionary* details = [NSMutableDictionary dictionary];
        [details setValue: errorText forKey: NSLocalizedDescriptionKey];
        returnError = [NSError errorWithDomain: AppErrorDomain code: newErrorCode userInfo: details];

        responseHandler(nil, returnError);

        return;
    }

    NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];

    if(statusCode != 200)
    {
        if(dictionary != nil) {
            if([dictionary objectForKey: @"error_code"] != nil) {
                errorCode = [dictionary objectForKey: @"error_code"];
            }

            if([dictionary objectForKey: @"error_description"] != nil) {
                errorText = [dictionary objectForKey: @"error_description"];
            }
        }

        if(errorCode == nil)
        {
            newErrorCode = UnexpectedError;

            errorText =  NSLocalizedString(@"There was an unexpected error.", @"There was an unexpected error.");

        }
        else {
            newErrorCode = [errorCode intValue];
        }

        NSMutableDictionary* details = [NSMutableDictionary dictionary];
        [details setValue: errorText forKey: NSLocalizedDescriptionKey];
        returnError = [NSError errorWithDomain: APPErrorDomain code: newErrorCode userInfo: details];
    }

    responseHandler(dictionary, returnError);

    return;

}];

在上面的异步网络调用中,我检查状态码是否不是 200 并假设这是一个错误。这是在 IOS 网络调用中处理错误/数据处理的正确方法吗?

如果http状态码不是200,我们是否总是假设来自异步请求的NSError总是非零,如果它是200,则总是零?

4

1 回答 1

0

据我了解,如果您NSURLConnection返回错误,则意味着未收到来自服务器的响应。

如果服务器发送它的响应,无论是什么 HTTP 代码,NSUrlConnection都不会给你任何错误(返回的错误将为 nil)。

实际上,NSURLError.h列出了与 NSURLConnection 相关的所有错误,它们可以是,例如:

NSURLErrorTimedOut
NSURLErrorCannotConnectToHost
NSURLErrorNetworkConnectionLost
NSURLErrorNotConnectedToInternet

因此,您可以在NSError从网络调用返回的对象中找到这种错误。

相反,如果你有一个 HTTP 错误,这意味着至少可以访问服务器,它会回复等等。

您还可以在网络分层架构的上下文中看到这一点,其中 HTTP 是一种应用程序协议,HTTP 错误仅在该级别有意义。

另一方面,NSURLConnection在传输级别工作,低于应用程序级别。因此,应用程序级别的错误对它没有任何意义,只是透明地从一端“传输”到另一端。

于 2013-10-11T18:31:08.293 回答