gpt4 book ai didi

ios - NSHTTPURLResponse 为 nil 但未生成 NSError

转载 作者:行者123 更新时间:2023-11-29 11:38:26 25 4
gpt4 key购买 nike

我正在尝试阅读 NSHTTPURLResponse状态代码,但是 NSHTTPURLResponse返回零,但没有 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 完成处理程序被异步调用,但您不会在尝试返回 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 更有意义的东西,但它说明了这个想法:不要尝试在不使用异步方法的情况下从异步方法返回值异步模式(例如完成处理程序)。

关于ios - NSHTTPURLResponse 为 nil 但未生成 NSError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47893916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com