Q:AFN网络框架怎么会跟缓存有一腿呢?缓存不是FMDB的事吗?两脸愣比
A: 了解URL缓存机制
0.1 AFNetworking使用NSURLConnection,它利用了原生的缓存机制NSURLCache
0.2 NSURLCache缓存了从服务器返回的NSURLResponse对象
0.3 NSURLCache的默认配置只是缓存在内存并没有写到硬盘
import YYCache
// YYCache配合缓存用
1.1 从内存中读,有就直接拿来用
1.2 没有再从磁盘读,有就拿来用,并写入内存中
1.3 仍然没有就返回空
import AFNetworking // CocoaSecurity将字符串转换为MD5工具 import CocoaSecurity enum AFNRequestMethod { case GET case POST } class NetworkTools: AFHTTPSessionManager { /** * @param method 请求方式 * @param parameters 请求参数 * @param finished 完成回调 */ func request(method:AFNRequestMethod,URLString:String,parameters:[Any],finished:@escaping (_ data:Any?,_ error:Error?)->()){ //2.1发起网络请求时进来通过URL到磁盘查找是否存在已缓存有的 if let responseByCache = NetworkTools.cacheJsonWithURL(URLString: URLString) { finished(responseByCache, nil) return } //成功回调 let success_block:((URLSessionDataTask, Any?) -> Swift.Void) = { (task, anyValue)->Void in finished(anyValue, nil) // 2.2 调用保存请求响应文件 NetworkTools.saveResponseToCacheFile(jsonResponse: anyValue, andURL: URLString) } //失败回调 let failure_block:((URLSessionDataTask?, Error) -> Swift.Void) = { (task,err)->Void in finished(nil, err) } if method == AFNRequestMethod.GET{ get(URLString, parameters: parameters, progress: nil, success: success_block, failure: failure_block) } else if method == AFNRequestMethod.POST{ post(URLString, parameters: parameters, progress: nil, success: success_block, failure: failure_block) } } extension NetworkTools{ // 查找是否存在缓存处理 class func cacheJsonWithURL(URLString:String) ->(Any?){ // path_md5 通过CocoaSecurity用URL字符串返回MD5 let path_md5:String = self.returnCompletionPathByMd5(URLString: URLString) // 创建YYCache会在path_md5沙盒路径下自动创建文件夹 let cache = YYCache.init(path: path_md5) let isContains = cache?.containsObject(forKey: URLString) ?? false if isContains { return cache?.object(forKey:URLString) } return nil } //保存过程处理 class func saveResponseToCacheFile(jsonResponse:Any?,andURL URLString:String){ let path = self.returnCompletionPathByMd5(URLString: URLString) let cache = YYCache.init(path: path) guard jsonResponse != nil else { return } let isExist:Bool = cache?.containsObject(forKey: URLString) ?? false cache?.setObject(jsonResponse as! NSCoding, forKey: URLString) if isExist { print("保存[\(URLString)]成功") } } }
Swift - 二次封装AFN(无网络走缓存基本原理)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 继承:AFURLSessionManager:NSObject 遵照:NSCopying, NSSecureCod...
- 网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的。1发送网络请求;get/post...