|
| 1 | +// |
| 2 | +// KtBaseServerAPI.m |
| 3 | +// KtTableView |
| 4 | +// |
| 5 | +// Created by baidu on 16/5/13. |
| 6 | +// Copyright © 2016年 zxy. All rights reserved. |
| 7 | +// |
| 8 | + |
| 9 | +#import "KtBaseServerAPI.h" |
| 10 | + |
| 11 | +@interface KtBaseServerAPI () |
| 12 | + |
| 13 | +@property (nonatomic, retain) NSString *server; |
| 14 | +@property (nonatomic, retain) NSDictionary *reqParams; |
| 15 | +@property (nonatomic, retain) NSDictionary *files; |
| 16 | +@property (nonatomic, assign) CFTimeInterval startTime; |
| 17 | +@property (nonatomic, assign) CFTimeInterval netCost; |
| 18 | +@property (nonatomic, strong) NSURLSessionDataTask *task; |
| 19 | + |
| 20 | +@end |
| 21 | + |
| 22 | +@implementation KtBaseServerAPI |
| 23 | + |
| 24 | +@synthesize rawString = _rawString; |
| 25 | + |
| 26 | +- (id)initWithServer:(NSString *)server { |
| 27 | + self = [super init]; |
| 28 | + if (self) { |
| 29 | + if (![server hasPrefix:@"http://"]) { |
| 30 | + server = [@"http://" stringByAppendingString:server]; |
| 31 | + } |
| 32 | + if ([server hasSuffix:@"/"]) { |
| 33 | + server = [server substringToIndex:server.length - 1]; |
| 34 | + } |
| 35 | + self.server = server; |
| 36 | + } |
| 37 | + return self; |
| 38 | +} |
| 39 | + |
| 40 | +#pragma -mark accessAPI |
| 41 | + |
| 42 | +- (void)accessAPI:(NSString *)api |
| 43 | + WithParams:(NSDictionary *)params |
| 44 | + files:(NSDictionary *)files |
| 45 | + requestMethod:(KtHttpRequestMethod)method |
| 46 | + completionBlock:(KtServerAPICompletionBlock)block { |
| 47 | + if (!self.manager) { |
| 48 | + // 应该获取一个全局唯一的 manager |
| 49 | + self.manager = [AFHTTPSessionManager manager]; |
| 50 | + self.manager.responseSerializer = [AFHTTPResponseSerializer serializer]; |
| 51 | + self.manager.responseSerializer.acceptableContentTypes = [self.manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; |
| 52 | + } |
| 53 | + |
| 54 | + if (self.state == KT_PROC_STAT_LOADING) { |
| 55 | + [self cancel]; |
| 56 | + } |
| 57 | + |
| 58 | + self.netCost = 0; // 网络请求统计 |
| 59 | + // 赋值 |
| 60 | + if (![api hasPrefix:@"/"]) { |
| 61 | + self.api = [@"/" stringByAppendingString:api]; |
| 62 | + } else { |
| 63 | + self.api = api; |
| 64 | + } |
| 65 | + self.reqParams = params; |
| 66 | + self.files = files; |
| 67 | + self.userBlock = block; |
| 68 | + |
| 69 | + // 重置状态 |
| 70 | + self.state = KT_PROC_STAT_CREATED; |
| 71 | + self.error = nil; |
| 72 | + self.jsonData = nil; |
| 73 | + self.rawData = nil; |
| 74 | + self.rawString = nil; |
| 75 | + |
| 76 | + // 统计时间 |
| 77 | + self.startTime = CFAbsoluteTimeGetCurrent(); |
| 78 | + |
| 79 | + // 允许子类调用自己的方法,附加请求参数 |
| 80 | + |
| 81 | + // 发起请求 |
| 82 | + NSString *url = [self.server stringByAppendingString:self.api]; |
| 83 | + if (method == KT_REQUEST_POST) { |
| 84 | + self.task = [self.manager POST:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { |
| 85 | + self.netCost = CFAbsoluteTimeGetCurrent() - self.startTime; // 统计网络请求时间 |
| 86 | + self.rawData = (NSData *)responseObject; |
| 87 | + self.jsonData = [NSJSONSerialization JSONObjectWithData:self.rawData options:NSJSONReadingMutableContainers error:nil]; |
| 88 | + self.state = KT_PROC_STAT_SUCCEED; |
| 89 | + |
| 90 | + if (self.userBlock) { |
| 91 | + self.userBlock(self); |
| 92 | + } |
| 93 | + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { |
| 94 | + self.state = KT_PROC_STAT_FAILED; |
| 95 | + }]; |
| 96 | + } |
| 97 | + else { |
| 98 | + // GET |
| 99 | + } |
| 100 | + self.state = KT_PROC_STAT_LOADING; // 状态设置为开始请求 |
| 101 | +} |
| 102 | + |
| 103 | +- (void)accessAPI:(NSString *)api |
| 104 | + WithParams:(NSDictionary *)params |
| 105 | + files:(NSDictionary *)files |
| 106 | + completionBlock:(KtServerAPICompletionBlock)block { |
| 107 | + [self accessAPI:api |
| 108 | + WithParams:params |
| 109 | + files:files |
| 110 | + requestMethod:KT_REQUEST_POST |
| 111 | + completionBlock:block]; |
| 112 | +} |
| 113 | + |
| 114 | +- (void)accessAPI:(NSString *)api |
| 115 | + WithParams:(NSDictionary *)params |
| 116 | + completionBlock:(KtServerAPICompletionBlock)block { |
| 117 | + [self accessAPI:api WithParams:params files:nil completionBlock:block]; |
| 118 | +} |
| 119 | + |
| 120 | +#pragma -mark 刷新与取消 |
| 121 | +// 刷新请求 |
| 122 | +- (void)refresh { |
| 123 | + [self accessAPI:self.api |
| 124 | + WithParams:self.reqParams |
| 125 | + files:self.files |
| 126 | + completionBlock:self.userBlock]; |
| 127 | +} |
| 128 | + |
| 129 | +// 中止请求 |
| 130 | +- (void)cancel { |
| 131 | + if (self.state == KT_PROC_STAT_LOADING) { |
| 132 | + self.state = KT_PROC_STAT_CANCELLED; |
| 133 | + [self.task cancel]; |
| 134 | + } else { |
| 135 | + // 提醒 |
| 136 | + return; |
| 137 | + } |
| 138 | +} |
| 139 | + |
| 140 | +// lazyloading |
| 141 | +- (NSString *)rawString { |
| 142 | + if (_rawString) { |
| 143 | + return _rawString; |
| 144 | + } |
| 145 | + if (self.rawData) { |
| 146 | + _rawString = [[[NSString alloc] initWithData:self.rawData encoding:NSUTF8StringEncoding] copy]; |
| 147 | + } |
| 148 | + return self->_rawString; |
| 149 | +} |
| 150 | + |
| 151 | +- (void)setRawString:(NSString *)rawString { |
| 152 | + if (self->_rawString == rawString) { |
| 153 | + return; |
| 154 | + } |
| 155 | + |
| 156 | + self->_rawString = [rawString copy]; |
| 157 | +} |
| 158 | + |
| 159 | +@end |
0 commit comments