轻量级的网络请求库,不依赖于任何第三方框架。基于NSURLSession,支持iOS7及以上。
OCNetPrintDecodeJSON
方法用于格式化打印 JSON,并转换 Unicode 编码,方便显示中文。
所有任务回调均不在主线程回调(方便调用者异步处理后续操作),除了进度回调(Progress Block)、通知。
1、基本使用,导入 OCNet.h
头文件
GET 请求,返回 NSData
[OCSessionManager GET:@"" parameter:nil completionBlock:^(NSURLSessionDataTask * _Nonnull task, NSData * _Nullable data, NSError * _Nullable error) {
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"respons=>%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
POST 请求,返回 NSData
+ (NSURLSessionDataTask *)POST:(NSString *)urlString parameter:(NSDictionary * _Nullable)parameter completionBlock:(OCSessionManagerCompletionBlock _Nullable)completionBlock;
文件上传,progressBlock 上传进度
+ (NSURLSessionUploadTask *)upload:(NSString *)urlString parameter:(NSDictionary * _Nullable)parameter data:(NSData *)data field:(NSString *)field fileName:(NSString *)fileName mimeType:(NSString *)mimeType progressBlock:(OCSessionManagerProgressBlock _Nullable)progressBlock completionBlock:(OCSessionManagerCompletionBlock _Nullable)completionBlock;
文件下载,destinationBlock 返回的 URL 为保存文件的地址
+ (NSURLSessionDownloadTask *)download:(NSString *)urlString destinationBlock:(NSURL *(^)(void))destinationBlock progressBlock:(OCSessionManagerProgressBlock _Nullable)progressBlock completionBlock:(OCSessionManagerCompletionBlock _Nullable)completionBlock;
2、自定义
继承 OCHttpRequest
类,该类提供了自定义的属性来满足业务需求。开始请求调用 startWithCompletinBlock
方法,停止请求调用 stopRequestWithBlock
方法。
子类重写 responseObject
方法返回自定义的序列化对象。
一般情况下请勿重写 urlRequest
方法,该方法是 OCHttpRequest 的核心实现。
3、请求重试 OCHttpRetryRequest
类提供了 retryCount
和 retryTimeIntervals
属性来实现重试机制。
retryCount
:用于控制重试的次数。
retryTimeIntervals
:用于设置每次重试请求的间隔。如果数组的长度小于 retryCount,那么之后的所有的重试请求间隔将使用数组的最后一个元素的值。如果数组没有元素,将会使用默认值 1 秒。
retryRequestCount
:属性统计重试请求的次数。
onRetryBlock
:重试请求回调 block,返回 YES 继续重试,否则停止请求
示例:
OCHttpRetryRequest *request = [[OCHttpRetryRequest alloc] initWithMethod:OCHttpRequestMethodGET urlString:@"https://suggest.taobao.com/sug" parameter:@{@"code":@"utf-8",@"q":@"女装"}];
request.retryTimeIntervals = @[@(3.0), @(2.0)];
request.responseType = OCHttpResponseTypeJSON;
[request setOnRetryBlock:^BOOL(__kindof OCHttpRetryRequest * _Nonnull request) {
if (request.retryRequestCount > 1) {
NSLog(@"%ld %ld", request.retryCount, request.retryRequestCount);
return NO;
}
return YES;
}];
[request startWithCompletinBlock:^(__kindof OCHttpRequest * _Nonnull request, __kindof OCHttpResponse * _Nonnull response) {
if (response.error) {
NSLog(@"%@", response.error);
} else {
id json = [(OCJSONResponse *)response json];
if (response.error) {
NSLog(@"%@", response.error);
} else {
NSLog(@"%@", OCNetPrintDecodeJSON(json));
}
}
}];
4、序列化
默认提供 form、JSON、data 实现,如果需要自定义序列化,继承 OCRequestSerializer
类,重写 generateURLRequest
和 generateRequestBody
方法。
5、代理
如果需要自定义处理 URLSession 的生命周期事件,请设置 OCSessionManager
类的 sessionDelegate
属性。如果 sessionDelegate 实现了 URLSession 生命周期事件,OCSessionManager 将不会触发任何通知和回调代理动作。
导入 OCRequestQueue.h
。注意:需要持有 OCChainRequestQueue
和 OCGroupRequestQueue
初始化后的对象。
1、需求:需要同时发送多个请求,每个请求按照顺序执行,并获取结果。 通过添加的顺序来确定每个请求任务的优先级和依赖关系。示例:
OCChainRequestQueue *chainQueue = [[OCChainRequestQueue alloc] init];
__weak typeof(chainQueue) weakQueue = chainQueue;
for (int i = 0; i < 10; i++) {
OCHttpRequest *request = [[OCHttpRequest alloc] initWithMethod:OCHttpRequestMethodGET urlString:@"https://suggest.taobao.com/sug" parameter:@{@"code":@"utf-8",@"q":[NSString stringWithFormat:@"女装+%d", i],@"callback":@"cb"}];
[request setCompletionBlock:^(OCHttpRequest *request, OCHttpResponse *response){
NSLog(@"request index=>%ld", weakQueue.currentIndex);
}];
[chainQueue entryRequest:request];
}
// 是否允许下一个请求执行
[_chainQueue setOnNextBlock:^BOOL(OCChainRequestQueue * _Nonnull queue, __kindof OCHttpRequest * _Nonnull request1, __kindof OCHttpRequest * _Nonnull request2) {
if (queue.currentIndex > 4) {
return NO;
}
return YES;
}];
[chainQueue startWithCompletionBlock:^(__kindof OCAbstractRequestQueue * _Nonnull requestQueue, NSError * _Nullable error) {
if (error) {
NSLog(@"执行%ld 错误=>%@", requestQueue.currentIndex, error);
} else {
NSLog(@"全部任务执行完成");
}
}];
2、需求:需要同时发送多个请求,不确定任务的执行顺序,所有请求完成后,并获取结果。示例:
OCGroupRequestQueue *groupQueue = [[OCGroupRequestQueue alloc] init];
__weak typeof(groupQueue) weakQueue = groupQueue;
for (int i = 0; i < 10; i++) {
OCHttpRequest *request = [[OCHttpRequest alloc] initWithMethod:OCHttpRequestMethodGET urlString:@"https://suggest.taobao.com/sug" parameter:@{@"code":@"utf-8",@"q":[NSString stringWithFormat:@"女装+%d", i],@"callback":@"cb"}];
[request setCompletionBlock:^(OCHttpRequest *request, OCHttpResponse *response){
NSLog(@"request index=>%ld", weakQueue.currentIndex);
}];
[groupQueue entryRequest:request];
}
[groupQueue startWithCompletionBlock:^(__kindof OCAbstractRequestQueue * _Nonnull requestQueue, NSError * _Nullable error) {
if (error) {
NSLog(@"执行%ld 错误=>%@", requestQueue.currentIndex, error);
} else {
NSLog(@"全部任务执行完成");
}
}];
3、大文件下载
示例:
OCBlobDownloadRequest *request = [[OCBlobDownloadRequest alloc] initWithURLString:@"http://wcy.dzryycs.com/vscode-osx.zip"];
request.saveFilePath = [NSString stringWithFormat:@"/Users/xxx/Desktop/%@", request.urlString.lastPathComponent];
request.tempFilePath = [NSString stringWithFormat:@"/Users/xxx/Desktop/temp-%@", request.urlString.lastPathComponent];
NSLog(@"saveFilePath=>%@", request.saveFilePath);
NSLog(@"tempFilePath=>%@", request.tempFilePath);
[request setProgressBlock:^(OCHttpRequest * _Nonnull request, float progress, int64_t completedUnitCount, int64_t totalUnitCount) {
NSLog(@"%.2fM %.2f", totalUnitCount / 1024.0 / 1024.0, progress);
}];
[request startWithCompletinBlock:^(OCHttpRequest *request, OCHttpResponse *response) {
if (response.error) {
NSLog(@"%@", response.error);
} else {
NSLog(@"下载成功");
}
}];
AFNetworkingUtils、以 AF 开头的方法、User-Agent 生成的代码来自 AFNetworking
。
OCReachability 修改 Apple 提供的 Reachability 类源码,并在此基础上增加了移动网络类型判断。