面试题答案
一键面试策略设计
- 请求队列管理:使用一个
NSMutableArray
来存储待执行的网络请求任务。 - 优先级判断:为每个请求任务添加一个优先级属性,例如使用
NSInteger
类型,值越大优先级越高。 - 网络状态监测:使用
Reachability
库来监测网络状态变化。 - 智能调度:当网络状态从无网络切换到有网络时,根据优先级从高到低依次执行请求任务,同时限制同一时间执行的请求数量,以避免网络拥塞。
关键代码实现
- 定义请求任务类
#import <Foundation/Foundation.h>
@interface NetworkRequest : NSObject
@property (nonatomic, strong) NSString *url;
@property (nonatomic, assign) NSInteger priority;
// 假设这里有个方法来执行实际的网络请求
- (void)executeRequest;
@end
@implementation NetworkRequest
- (void)executeRequest {
// 实际网络请求代码,这里简单打印
NSLog(@"Executing request for URL: %@ with priority: %ld", self.url, (long)self.priority);
}
@end
- 请求队列管理与优先级判断
#import <Foundation/Foundation.h>
#import "NetworkRequest.h"
@interface RequestQueueManager : NSObject
@property (nonatomic, strong) NSMutableArray<NetworkRequest *> *requestQueue;
@property (nonatomic, assign) NSInteger maxConcurrentRequests;
- (void)addRequest:(NetworkRequest *)request;
- (void)startRequests;
@end
@implementation RequestQueueManager
- (instancetype)init {
self = [super init];
if (self) {
self.requestQueue = [NSMutableArray array];
self.maxConcurrentRequests = 3; // 假设最多同时执行3个请求
}
return self;
}
- (void)addRequest:(NetworkRequest *)request {
[self.requestQueue addObject:request];
}
- (void)startRequests {
NSMutableArray<NetworkRequest *> *requestsToExecute = [NSMutableArray array];
// 根据优先级排序,从高到低
NSArray<NetworkRequest *> *sortedRequests = [self.requestQueue sortedArrayUsingComparator:^NSComparisonResult(NetworkRequest * _Nonnull obj1, NetworkRequest * _Nonnull obj2) {
return obj2.priority - obj1.priority;
}];
for (NetworkRequest *request in sortedRequests) {
if (requestsToExecute.count < self.maxConcurrentRequests) {
[requestsToExecute addObject:request];
} else {
break;
}
}
for (NetworkRequest *request in requestsToExecute) {
[request executeRequest];
// 实际应用中这里应该是异步执行请求,并在请求完成后从队列中移除
[self.requestQueue removeObject:request];
}
// 递归执行剩余请求
if (self.requestQueue.count > 0) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self startRequests];
});
}
}
@end
- 网络状态监测与调度触发
#import "ViewController.h"
#import <AFNetworking/AFNetworking.h>
#import "RequestQueueManager.h"
@interface ViewController ()
@property (nonatomic, strong) RequestQueueManager *queueManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.queueManager = [[RequestQueueManager alloc] init];
// 监测网络状态
AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManager sharedManager];
[reachabilityManager startMonitoring];
[reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status == AFNetworkReachabilityStatusReachableViaWiFi || status == AFNetworkReachabilityStatusReachableViaWWAN) {
[self.queueManager startRequests];
}
}];
// 添加一些示例请求
NetworkRequest *request1 = [[NetworkRequest alloc] init];
request1.url = @"https://example.com/api1";
request1.priority = 2;
[self.queueManager addRequest:request1];
NetworkRequest *request2 = [[NetworkRequest alloc] init];
request2.url = @"https://example.com/api2";
request2.priority = 1;
[self.queueManager addRequest:request2];
NetworkRequest *request3 = [[NetworkRequest alloc] init];
request3.url = @"https://example.com/api3";
request3.priority = 3;
[self.queueManager addRequest:request3];
}
@end
以上代码实现了一个简单的网络请求队列管理和优先级调度系统,在网络状态恢复时,能够智能调度请求任务并避免网络拥塞。实际应用中,网络请求部分可能需要使用更成熟的网络框架(如AFNetworking或Alamofire),并且在请求完成后需要正确处理队列的更新。