我正在尝试阅读account.move
状态代码,但NSHTTPURLResponse
返回nil,但未创建NSHTTPURLResponse
。
这个在iOS 11之前工作,但我没有收到任何警告称它已被弃用,我无法找到任何在线引用此问题的NSError
。
知道为什么吗?
我通常会调用以下方法NSURLSession
[MyClass getHTTPResponseRequest:@"http://www.google.com/"];
答案 0 :(得分: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
更有意义的东西,但它说明了这个想法:不要尝试从异步方法返回值而不使用异步模式(例如完成处理程序)。