MST

星途 面试题库

面试题:Objective-C 中如何实现高性能网络编程基础架构中的网络请求模块

假设你要搭建一个高性能网络编程基础架构,在 Objective-C 语言环境下,请阐述如何设计并实现一个网络请求模块,需要考虑到请求队列管理、网络状态监测以及请求的缓存策略等方面,简单描述关键类和方法的设计思路。
14.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

关键类设计思路

  1. 网络请求管理器类(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:将响应数据缓存起来。
  2. 网络请求类(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、参数和请求方法。
  3. 网络状态监测类(Reachability)

    • 功能:监测网络连接状态,如是否有网络、是 Wi-Fi 还是蜂窝网络等。
    • 属性
      • SCNetworkReachabilityRef reachabilityRef:系统提供的可达性引用对象。
      • NetworkStatus currentReachabilityStatus:当前网络状态枚举值。
    • 方法
      • +(instancetype)reachabilityWithHostname:(NSString *)hostname:创建可达性监测对象。
      • -(NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags:根据系统可达性标志获取网络状态。
      • -(void)startNotifier:开始监测网络状态变化。

实现步骤

  1. 请求队列管理
    • 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];
    }
}
  1. 请求缓存策略
    • 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];
}