NSHTTPURLResponse 为 nil 但未生成 NSError
NSHTTPURLResponse is nil but no NSError is generated
我正在尝试读取 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 11 之前也行不通。 dataTaskWithURL
完成处理程序是异步调用的,但您在尝试 return 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
现在,显然您的完成处理程序参数通常 return 比整数 statusCode
更有意义,但它说明了这个想法:不要尝试 return来自不使用异步模式(例如完成处理程序)的异步方法的值。
我正在尝试读取 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 11 之前也行不通。 dataTaskWithURL
完成处理程序是异步调用的,但您在尝试 return 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
现在,显然您的完成处理程序参数通常 return 比整数 statusCode
更有意义,但它说明了这个想法:不要尝试 return来自不使用异步模式(例如完成处理程序)的异步方法的值。