测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布上次发布 | 2016年8月 |
由xiongzenghui维护。
依赖 | |
AFNetworking | >= 0 |
YYModel | >= 0 |
首先非常感谢YTKNetwork贡献了这么优质的代码,我也是一字一句看完了所有的代码实现,看完之后觉得有一些地方可以优化,于是就斗胆发出来了。
LRU算法
因为我同样在准备使用NSURLSession来实现。
(1) 大部分实现都是基于YTKNetwork,但是YTKNetwork的缓存都是使用文件
缓存,将其改为主要依赖内存
缓存,并提供了线程安全控制
(2) 最终是AFNetworking,基于NSURLSession
实现版本,YTKNetwork仍然是基于NSOperation+NSURLConnection
实现
(3) JSON转实体类集成了YYModel
,YYModel中的缓存都是使用锁进行同步的,所以是线程安全的
#import "KernelRequest.h"
@interface WeatherRequest : KernelRequest
- (instancetype)initWithkeyWord:(NSString *)keyWord;
@end
#import "WeatherRequest.h"
#import "WeatherResponse.h"
/**
* http://gc.ditu.aliyun.com/geocoding?a=苏州市
*/
@implementation WeatherRequest {
NSString *_keyWord;
}
- (instancetype)initWithkeyWord:(NSString *)keyWord {
if (self = [super init]) {
_keyWord = [keyWord copy];
}
return self;
}
- (KernelRequestMethod)requestMethod {
return KernelRequestMethodGET;
}
- (NSString *)host {
return @"http://gc.ditu.aliyun.com";
}
- (NSString *)requestURL {
return @"/geocoding";
}
- (id)requestArgument {
return @{
@"a" : _keyWord,
};
}
- (KernelRequestAPIType)requestApiType {
return KernelRequestAPITypeRestfull;
}
- (NSTimeInterval)cacheDurationTime {
return 30;
}
- (long long)cacheVersion {
return 1;
}
- (Class)responseClass {
return [WeatherModel class];
}
- (KernelResponseThreadType)responseThread {
return KernelResponseThreadTypeBackgroudThread;
}
@end
WeatherRequest *req1 = [[WeatherRequest alloc] initWithkeyWord:@"苏州市"];
[req1 startWithSuccessComplet:^(KernelBaseRequest *request) {
// 使用缓存
KernelRequest *req = (KernelRequest *)request;
id cacheJSON = [req cachedJSON];
if (cacheJSON) {
NSLog(@"cached response object = %@", cacheJSON);
} else {
NSLog(@"response object = %@", request.responseObject);
}
// json 解析
WeatherModel *model = req1.responseModelObject;
NSLog(@"model.address = %@", model.address);
NSLog(@"model.alevel = %ld", model.alevel);
NSLog(@"model.level = %ld", model.level);
NSLog(@"model.cityName = %@", model.cityName);
NSLog(@"model.lat = %@", model.lat);
NSLog(@"model.lon = %@", model.lon);
} failComplet:^(KernelBaseRequest *request) {
NSLog(@"error = %@", request.responseError);
}];
- (void)test3 {
//1. 创建一个链式请求
KernelChainRequest *chainReq = [[KernelChainRequest alloc] init];
//2. 创建一个基本请求
WeatherRequest *req1 = [[WeatherRequest alloc] initWithkeyWord:@"苏州市"];
// 3. 向链式中添加一个基本请求
[chainReq addBasicRequest:req1 didBasicRequestFinished:^(KernelChainRequest * _Nonnull chainReq, KernelRequest * _Nonnull basicReq)
{
//4. 创建二个基本请求
Wearther2Request *req2 = [[Wearther2Request alloc] initWithkeyWord:@"上海市"];
//5. 向链式中添加二个基本请求
[chainReq addBasicRequest:req2 didBasicRequestFinished:^(KernelChainRequest * _Nonnull chainReq, KernelRequest * _Nonnull basicReq)
{
//6. 创建三个基本请求
IPReqyest *req3 = [[IPReqyest alloc] initWithIp:@"218.4.255.255"];
//7. 向链式中添加二个基本请求
[chainReq addBasicRequest:req3 didBasicRequestFinished:^(KernelChainRequest * _Nonnull chainReq, KernelRequest * _Nonnull basicReq)
{
NSLog(@"");
}];
}];
}];
[chainReq startWithDelegate:self];
}
- (void)kernelChainRequestDidSuccessFinish:(KernelChainRequest *__nullable)chainReq {
NSLog(@"链式请求全部执行完毕");
}
- (void)kernelChainRequest:(KernelChainRequest *__nullable)chainReq didBasicRequestFailed:(KernelRequest *__nullable)request
{
NSLog(@"其中有一个错误执行结束: %@", request);
}
- (void)test4 {
WeatherRequest *req1 = [[WeatherRequest alloc] initWithkeyWord:@"苏州市"];
Wearther2Request *req2 = [[Wearther2Request alloc] initWithkeyWord:@"上海市"];
IPReqyest *req3 = [[IPReqyest alloc] initWithIp:@"218.4.255.255"];
NSArray *requests = @[req1, req2, req3];
KernelBatchRequest *batchReq = [[KernelBatchRequest alloc] initWithBasicRequestArray:requests];
[batchReq startWithDelegate:self];
}
- (void)batchRequestDidSuccessFinish:(KernelBatchRequest *)batchRequest {
NSLog(@"批量请求全部执行完毕");
}
- (void)batchRequest:(KernelBatchRequest *)batchReq didBasicRequestFailed:(KernelRequest *)request {
NSLog(@"其中有一个错误执行结束: %@", request);
}
- (void)test5 {
[KernelInterfaceAdapter sharedInstance].delegate = self;
}
/**
* KernelInterfaceAdapter日志信息回调
*
* @param level 日志级别
* @param module 模块名称
* @param content 日志正文
*/
- (void)kernelInterfaceLogAdapterWithLevel:(KernelLogOutputLevel)level
module:(NSString *__nonnull)module
content:(NSString *__nullable)content
{
//do your things about log infos.....
}