面试题答案
一键面试关键类设计思路
-
网络请求管理器类(NetworkRequestManager)
- 功能:负责管理请求队列,协调网络请求的发送、暂停、取消等操作,并与网络状态监测模块交互。
- 属性:
NSMutableArray<NSURLSessionTask *> *requestQueue
:用于存储待处理或正在处理的网络请求任务。Reachability *reachability
:用于监测网络状态的可达性对象。NSMutableDictionary<NSString *, id> *cache
:存储请求缓存数据的字典,键为请求 URL 等标识,值为缓存数据。
- 方法:
-(void)addRequest:(NSURLSessionTask *)request
:将请求添加到请求队列。-(void)startRequests
:开始处理请求队列中的请求。-(void)pauseRequests
:暂停请求队列中的所有请求。-(void)cancelRequests
:取消请求队列中的所有请求。-(id)cachedResponseForRequest:(NSURLRequest *)request
:根据请求获取缓存响应数据。-(void)cacheResponse:(id)response forRequest:(NSURLRequest *)request
:将响应数据缓存起来。
-
网络请求类(NetworkRequest)
- 功能:封装具体的网络请求相关信息,如请求 URL、参数、请求方法等。
- 属性:
NSURLRequest *request
:具体的 URL 请求对象。NSString *requestIdentifier
:请求的唯一标识,可由 URL 和参数生成。void (^completionHandler)(NSData *data, NSURLResponse *response, NSError *error)
:请求完成后的回调 block。
- 方法:
-(instancetype)initWithURL:(NSURL *)url parameters:(NSDictionary *)parameters requestMethod:(NSString *)method
:初始化网络请求对象,设置请求 URL、参数和请求方法。
-
网络状态监测类(Reachability)
- 功能:监测网络连接状态,如是否有网络、是 Wi-Fi 还是蜂窝网络等。
- 属性:
SCNetworkReachabilityRef reachabilityRef
:系统提供的可达性引用对象。NetworkStatus currentReachabilityStatus
:当前网络状态枚举值。
- 方法:
+(instancetype)reachabilityWithHostname:(NSString *)hostname
:创建可达性监测对象。-(NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags
:根据系统可达性标志获取网络状态。-(void)startNotifier
:开始监测网络状态变化。
实现步骤
- 请求队列管理
- 在
NetworkRequestManager
类中,通过addRequest:
方法将NetworkRequest
封装的请求添加到requestQueue
数组中。 startRequests
方法遍历requestQueue
,使用NSURLSession
创建并启动网络任务。例如:
- 在
-(void)startRequests {
for (NSURLSessionTask *task in self.requestQueue) {
[task resume];
}
}
- `pauseRequests` 和 `cancelRequests` 方法分别对 `requestQueue` 中的任务调用 `suspend` 和 `cancel` 方法。
2. 网络状态监测
- 使用 Reachability
类,在 NetworkRequestManager
初始化时创建可达性监测对象并开始监测。
- 当网络状态变化时,Reachability
类会调用相应的回调,在 NetworkRequestManager
中可根据网络状态暂停、恢复或取消请求队列中的请求。例如:
- (void)reachabilityChanged:(NSNotification *)note {
Reachability* curReach = note.object;
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
NetworkStatus status = [curReach currentReachabilityStatus];
if (status == NotReachable) {
[self pauseRequests];
} else {
[self startRequests];
}
}
- 请求缓存策略
- 在
NetworkRequestManager
类中实现缓存逻辑。在发送请求前,通过cachedResponseForRequest:
方法检查是否有缓存数据,如果有则直接返回给调用者。 - 请求完成后,在回调中通过
cacheResponse:forRequest:
方法将响应数据缓存起来。例如:
- 在
-(void)cacheResponse:(id)response forRequest:(NSURLRequest *)request {
NSString *key = request.URL.absoluteString;
self.cache[key] = response;
}
-(id)cachedResponseForRequest:(NSURLRequest *)request {
NSString *key = request.URL.absoluteString;
return self.cache[key];
}