面试题答案
一键面试基本思路
DNS 预解析就是在真正发起网络请求前,提前解析目标域名对应的 IP 地址,这样当发起请求时就可以直接使用解析好的 IP,减少 DNS 解析带来的延迟。
常用方法
使用 NSURLSession
相关类库结合 NSHost
类来实现 DNS 预解析。
主要代码逻辑
- 导入必要的头文件:
#import <Foundation/Foundation.h>
- 创建解析方法:
- (void)resolveHost:(NSString *)host completionHandler:(void (^)(NSArray<NSString *> * _Nullable addresses, NSError * _Nullable error))completionHandler {
NSHost *hostObject = [NSHost hostWithName:host];
[hostObject resolveWithTimeout:5.0 completionHandler:^(NSArray<NSString *> * _Nullable addresses, NSError * _Nullable error) {
if (error) {
NSLog(@"DNS 解析失败: %@", error);
} else {
NSLog(@"解析到的 IP 地址: %@", addresses);
}
completionHandler(addresses, error);
}];
}
- 调用解析方法:
NSString *targetHost = @"example.com";
[self resolveHost:targetHost completionHandler:^(NSArray<NSString *> * _Nullable addresses, NSError * _Nullable error) {
// 这里可以处理解析结果,比如根据解析到的 IP 发起网络请求等
}];
在实际网络请求时,可以通过配置 NSURLSessionConfiguration
来使用预解析得到的 IP 地址。例如:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 假设已经预解析得到 IP 地址,这里以第一个解析到的 IP 为例
NSString *resolvedIP = addresses.firstObject;
NSURLComponents *components = [NSURLComponents componentsWithString:@"http://example.com"];
components.host = resolvedIP;
NSURL *url = components.URL;
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 处理网络请求结果
}];
[task resume];