NSHTTPURLResponse为nil但未生成NSError

问题描述 投票:1回答:1

我正在尝试阅读NSHTTPURLResponse状态代码,但NSHTTPURLResponse返回nil,但没有创建NSError

这在iOS 11之前有效,但我没有得到任何警告,它已被弃用,我无法找到任何在线引用NSURLSession的问题。

知道为什么吗?

我一般称之为[MyClass getHTTPResponseRequest:@"http://www.google.com/"];

+ (NSInteger) getHTTPResponseRequest : (NSString*) testURL {
    __block NSHTTPURLResponse * r = nil;

    [[[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:testURL]
                                 completionHandler:^(NSData *data, NSURLResponse *response,  NSError *error) {

                if (error) {
                     NSLog(@"Error %@", error.localizedDescription);
                }

                r = (NSHTTPURLResponse *)response;

    }] resume];

    if(r == nil){
        NSLog(@"Response is nil");
        return 9999;
    }

    return r.statusCode;
}
ios objective-c objective-c-blocks nsurlsession nserror
1个回答
1
投票

这在iOS 11之前也没有用。 dataTaskWithURL完成处理程序是异步调用的,但在尝试返回statusCode之前,您不是在等待请求完成。

您应该采用异步模式,例如自己使用完成处理程序模式

+ (void)getHTTPResponseRequestWithURL:(NSString *)urlString completion:(void(^ _Nonnull)(NSInteger))completion {
    NSURL *url = [NSURL URLWithString:urlString];

    [[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response,  NSError *error) {
        if (error) {
            NSLog(@"Error %@", error.localizedDescription);
        }

        NSInteger statusCode;
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
            statusCode = [(NSHTTPURLResponse *)response statusCode];
        } else {
            statusCode = 9999;
        }

        completion(statusCode);
    }] resume];
}

你会这样称呼它:

[MyClass getHTTPResponseRequestWithURL:@"http://google.com" completion:^(NSInteger statusCode) {
    // examine the `statusCode` here

    NSLog(@"%ld", (long)statusCode);
}];

// but the above runs asynchronously, so you won't have `statusCode` here

现在,显然你的完成处理程序参数通常返回比整数statusCode更有意义的东西,但它说明了这个想法:不要尝试从异步方法返回值而不使用异步模式(例如完成处理程序)。

© www.soinside.com 2019 - 2024. All rights reserved.