iOS-基于AFN列表分页异步加载+数据缓存的处理类封装
前言
类的封装
#import <Foundation/Foundation.h>
@interface NetWorkHandle : NSObject
+ (NetWorkHandle *)shareManager;
- (void)loadNewsWithStart:(NSInteger)start serverUrl:(NSString *)serverUrl params:(NSDictionary *)params complete:(void(^)(NSDictionary *object))completeBlock failed:(void(^)(NSError *error))failedBlock;
@end
#import "NetWorkHandle.h"
#import <AFNetworking.h>
#define QUEUE_NAME "com.eoc.EOCNews.Net"
#define FILE_NAME @"emptyCar"
@interface NetWorkHandle ()
@property (strong, nonatomic) dispatch_queue_t netQueue;
@end
@implementation NetWorkHandle
#pragma mark -- out method
+ (NetWorkHandle *)shareManager {
static dispatch_once_t onceToken;
static NetWorkHandle *__netManager;
dispatch_once(&onceToken, ^{
if (__netManager == nil) {
__netManager = [[NetWorkHandle alloc] init];
}
});
return __netManager;
}
- (void)loadNewsWithStart:(NSInteger)start serverUrl:(NSString *)serverUrl params:(NSDictionary *)params complete:(void(^)(NSDictionary *object))completeBlock failed:(void(^)(NSError *error))failedBlock {
__weak typeof(self) weakSelf = self;
[self runInQueue:^{
@autoreleasepool {
[weakSelf loadMoreNews:serverUrl params:params start:start num:5 complete:completeBlock failed:failedBlock];
}
}];
}
#pragma mark -- innner method
- (void)loadMoreNews:(NSString *)serverUrl params:(NSDictionary *)params start:(NSInteger)startNum num:(NSInteger)newsNum complete:(void(^)(NSDictionary *object))completeBlock failed:(void(^)(NSError *error))failedBlock {
[self runInMainThread:^{
[MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow];
[MBProgressHUD showMessage:@"加载中" toView:[UIApplication sharedApplication].keyWindow];
}];
if ([[NSFileManager defaultManager] fileExistsAtPath:[self testDataPathWithStart:startNum]]) {
[self runInMainThread:^{
[MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow];
}];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
if (completeBlock) {
NSData *data = [NSData dataWithContentsOfFile:[self testDataPathWithStart:startNum]];
NSDictionary *object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
completeBlock(object);
}
});
return;
}
NSMutableDictionary *tempOneDic = nil;
if(params) {
tempOneDic = [NSMutableDictionary dictionaryWithDictionary:params];
tempOneDic[@"version"] = vesionPro;
}
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
if([UserData shareInstance].token.length > 0) {
[manager.requestSerializer setValue:[UserData shareInstance].token forHTTPHeaderField:@"token"];
}
__weak typeof(self) weakSelf = self;
[manager POST:serverUrl parameters:tempOneDic progress:^(NSProgress *downloadProgress) {
} success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
if(dic[@"code"] && ([dic[@"code"] integerValue] == 200)) {
[self runInMainThread:^{
[MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow];
}];
if (completeBlock) {
completeBlock(dic);
[self runBackground:^{
NSString *fileName = [weakSelf testDataPathWithStart:startNum];
[responseObject writeToFile:fileName atomically:YES];
}];
}
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
[self runInMainThread:^{
[MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow];
}];
if (failedBlock) {
[self runInMainThread:^{
[MBProgressHUD tipShowWithMessage:@"请求超时,请检查网络" toView:[UIApplication sharedApplication].keyWindow];
}];
failedBlock(error);
}
}];
}
- (NSString *)testDataPathWithStart:(NSInteger)start {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *fileName = [FILE_NAME stringByAppendingFormat:@"_%ld",(long)start];
return [docDir stringByAppendingPathComponent:fileName];
}
#pragma mark -- thread
- (void)runBackground:(void(^)(void))block {
if ([[NSThread currentThread] isMainThread]) {
dispatch_async(dispatch_get_global_queue(0, 0), block);
} else {
block();
}
}
- (void)runInMainThread:(void(^)(void))block {
if ([[NSThread currentThread] isMainThread]) {
block();
} else {
dispatch_async(dispatch_get_main_queue(), block);
}
}
- (void)runInQueue:(void(^)(void))block {
dispatch_async(self.netQueue, block);
}
#pragma mark -- thread manager
- (dispatch_queue_t)netQueue {
if (_netQueue == nil) {
_netQueue = dispatch_queue_create(QUEUE_NAME, DISPATCH_QUEUE_SERIAL);
}
return _netQueue;
}
@end
使用
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
dic[@"page"] = @(1);
dic[@"rows"] = @(5);
__weak typeof(self) weakSelf = self;
[[NetWorkHandle shareManager] loadNewsWithStart:page serverUrl:[BaseNetWorkRequestUrlString uploadBaseURL:[BaseNetWorkRequestUrlString getTailOfEndURL:kURLwaybillgrabPage]] params:dic complete:^(NSDictionary *object) {
EmptyCarModel *emptyCarModel = [EmptyCarModel mj_objectWithKeyValues:object[@"obj"]];
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf.emptyCarView setEmptyCarData:emptyCarModel page:page];
});
} failed:^(NSError *error) {
[weakSelf.emptyCarView endHeadAndFootRefresh];
}];