当前位置: 首页 > 编程日记 > 正文

iOS ---网络请求封装(自动缓存与手动缓存)

#import <Foundation/Foundation.h>


@interface WNetworkCache : NSObject


/**

 *  手动写入/更新缓存

 *

 *  @param jsonResponse 要写入的数据

 *  @param URL    请求URL

 *

 *  @return 是否写入成功

 */

+(BOOL)saveJsonResponseToCacheFile:(id)jsonResponse andURL:(NSString *)URL;


/**

 *  获取缓存的对象

 *

 *  @param URL 请求URL

 *

 *  @return 缓存对象

 */

+(id )cacheJsonWithURL:(NSString *)URL;


@end



/**

 *  成功

 */

typedef void(^httpRequestSucess) (id responseObject);

/**

 *  失败

 */

typedef void(^httpRequestFailed) (NSError *error);


/**

 *  缓存

 */

typedef void(^httpRequestCache) (id jsonCache);



@interface XHNetworking : NSObject


/**

 *  POST请求

 *

 *  @param URL     URL String

 *  @param dic     参数

 *  @param success 成功回调

 *  @param failure 失败回调

 */

+(void)POST:(NSString *)URL parameters:(NSDictionary *)dic success:(httpRequestSucess)success failure:(httpRequestFailed)failure;



/**

 *  POST请求,自动缓存

 *

 *  @param URL       URL String

 *  @param dic       参数

 *  @param jsonCache 缓存回调

 *  @param success   成功回调

 *  @param failure   失败回调

 */

+(void)POST:(NSString *)URL parameters:(NSDictionary *)dic jsonCache:(httpRequestCache)jsonCache  success:(httpRequestSucess)success failure:(httpRequestFailed)failure;



/**

 *  GET请求

 *

 *  @param URL     URL String

 *  @param dic     参数

 *  @param success 成功回调

 *  @param failure 失败回调

 */

+(void)GET:(NSString *)URL parameters:(NSDictionary *)dic success:(httpRequestSucess)success failure:(httpRequestFailed)failure;


/**

 *  GET请求,自动缓存

 *

 *  @param URL           URL String

 *  @param dic           参数

 *  @param jsonCache 缓存回调

 *  @param success       成功回调

 *  @param failure       失败回调

 */

+(void)GET:(NSString *)URL parameters:(NSDictionary *)dic  jsonCache:(httpRequestCache)jsonCache success:(httpRequestSucess)success failure:(httpRequestFailed)failure;


@end












#import "WNetworkCache.h"

#import <CommonCrypto/CommonDigest.h>

#import "AFHTTPSessionManager.h"


#ifdef DEBUG

#define DebugLog(...) NSLog(__VA_ARGS__)

#else

#define DebugLog(...)

#endif



@interface WNetworkCache ()



@end



@implementation WNetworkCache


+(BOOL)saveJsonResponseToCacheFile:(id)jsonResponse andURL:(NSString *)URL

{

    NSDictionary *json = jsonResponse;

    if(json!=nil)

    {

        BOOL state =[NSKeyedArchiver archiveRootObject:jsonResponse toFile:[self cacheFilePathWithURL:URL]];

        if(state)

        {

            DebugLog(@"缓存写入/更新成功");

        }

        

        return state;

    }

    

    return NO;

}


+(id )cacheJsonWithURL:(NSString *)URL

{

    NSString *path = [self cacheFilePathWithURL:URL];

    id cacheJson;

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:path isDirectory:nil] == YES) {

        cacheJson = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    }

    return cacheJson;

}


+ (NSString *)cacheFilePathWithURL:(NSString *)URL {

    

    NSString *pathOfLibrary = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *path = [pathOfLibrary stringByAppendingPathComponent:@"XHNetworkCache"];

    

    [self checkDirectory:path];//check路径

    DebugLog(@"path = %@",path);

    

    //文件名

    NSString *cacheFileNameString = [NSString stringWithFormat:@"URL:%@ AppVersion:%@",URL,[self appVersionString]];

    NSString *cacheFileName = [self md5StringFromString:cacheFileNameString];

    path = [path stringByAppendingPathComponent:cacheFileName];

    return path;

}


+(void)checkDirectory:(NSString *)path {

    NSFileManager *fileManager = [NSFileManager defaultManager];

    BOOL isDir;

    if (![fileManager fileExistsAtPath:path isDirectory:&isDir]) {

        [self createBaseDirectoryAtPath:path];

    } else {

        if (!isDir) {

            NSError *error = nil;

            [fileManager removeItemAtPath:path error:&error];

            [self createBaseDirectoryAtPath:path];

        }

    }

}


+ (void)createBaseDirectoryAtPath:(NSString *)path {

    __autoreleasing NSError *error = nil;

    [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES

                                               attributes:nil error:&error];

    if (error) {

        DebugLog(@"create cache directory failed, error = %@", error);

    } else {

        

        [self addDoNotBackupAttribute:path];

    }

}

+ (void)addDoNotBackupAttribute:(NSString *)path {

    NSURL *url = [NSURL fileURLWithPath:path];

    NSError *error = nil;

    [url setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];

    if (error) {

        DebugLog(@"error to set do not backup attribute, error = %@", error);

    }

}


+ (NSString *)md5StringFromString:(NSString *)string {

    

    if(string == nil || [string length] == 0return nil;

    

    const char *value = [string UTF8String];

    

    unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];

    CC_MD5(value, (CC_LONG)strlen(value), outputBuffer);

    

    NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];

    for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){

        [outputString appendFormat:@"%02x",outputBuffer[count]];

    }

    

    return outputString;

}

+ (NSString *)appVersionString {

    

    return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

}

@end


#pragma mark- @interface XHNetworking

@interface XHNetworking()


@end

@implementation XHNetworking


+(AFHTTPSessionManager *)createManager

{

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    

    //申明请求类型:HTTP

    //(AFJSONRequestSerializer,AFHTTPRequestSerializer)

    manager.requestSerializer = [AFHTTPRequestSerializer serializer];

    //申明返回的结果:JSON

    //AFJSONResponseSerializer,AFHTTPResponseSerializer

    manager.responseSerializer = [AFJSONResponseSerializer serializer];

    

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil];

    

    return manager;

}

/**

 *  POST请求

 */

+(void)POST:(NSString *)URL parameters:(NSDictionary *)dic  success:(httpRequestSucess)success failure:(httpRequestFailed)failure

{

    AFHTTPSessionManager *manager = [self createManager];

    [manager POST:URL parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        

        success(responseObject);

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        

        DebugLog(@"error=%@",error);

        

        failure(error);

    }];

}


/**

 *  POST请求,自动缓存

 */

+(void)POST:(NSString *)URL parameters:(NSDictionary *)dic jsonCache:(httpRequestCache)jsonCache  success:(httpRequestSucess)success failure:(httpRequestFailed)failure;

{

    //缓存

    jsonCache([WNetworkCache cacheJsonWithURL:URL]);

    

    AFHTTPSessionManager *manager = [self createManager];

    [manager POST:URL parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        

        success(responseObject);

        

        [WNetworkCache saveJsonResponseToCacheFile:responseObject andURL:URL];

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        

        DebugLog(@"error=%@",error);

        

        failure(error);

    }];

}


/**

 *  GET请求

 */

+(void)GET:(NSString *)URL parameters:(NSDictionary *)dic success:(httpRequestSucess)success failure:(httpRequestFailed)failure

{

    AFHTTPSessionManager *manager = [self createManager];

    [manager GET:URL parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        

        success(responseObject);

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        

        DebugLog(@"error=%@",error);

        

        failure(error);

        

    }];

}


/**

 *  GET请求,自动缓存

 */

+(void)GET:(NSString *)URL parameters:(NSDictionary *)dic  jsonCache:(httpRequestCache)jsonCache success:(httpRequestSucess)success failure:(httpRequestFailed)failure{

    

    //缓存

    jsonCache([WNetworkCache cacheJsonWithURL:URL]);

    

    AFHTTPSessionManager *manager = [self createManager];

    [manager GET:URL parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        

        success(responseObject);

        

        [WNetworkCache saveJsonResponseToCacheFile:responseObject andURL:URL];

        

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        

        DebugLog(@"error=%@",error);

        

        failure(error);

        

    }];

    

}



@end






相关文章:

Windows下获取视频设备的一种改进实现

之前在https://blog.csdn.net/fengbingchun/article/details/102806822中介绍过在Windows下获取视频设备列表的方法。其实那种实现方法是有缺陷的&#xff0c;当PC机上连接多个视频设备&#xff0c;并且其中有设备处于启动运行状态时&#xff0c;再调用相关接口获取视频设备可能…

最新单步目标检测框架,引入双向网络,精度和速度均达到不错效果

作者 | Tiancai Wang等译者 | 路一直都在出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;one-stage的目标检测方法因其具有实时性强、检测精度高等特点&#xff0c;近年来受到广泛关注。目标检测包括分类和定位两个子任务&#xff0c;通常来说&#xff0c;one-stage目…

基于Sentinel的Redis3.2高可用方案

默认情况下&#xff0c;Redis node和sentinel的protected-mode都是yes&#xff0c;在搭建集群时&#xff0c;若想从远程连接redis集群&#xff0c;需要将redis.conf和sentinel.conf的protected-mode修改为no&#xff0c;若只修改redis node&#xff0c;从远程连接sentinel后&am…

从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的

整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】人工智能时代&#xff0c;机器学习已经渗透进每个领域&#xff0c;改变了这些领域的业务模式、技术架构以及方法论。随着深度学习技术近年来快速发展&#xff0c;高效、易用的机器学习平台对于互联…

最新 macOS Sierra 10.12.3 安装CocoaPods及使用详解

cocoapods官网&#xff1a;https://guides.cocoapods.org 一、什么是CocoaPods 每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如 Java 语言的 Maven&#xff0c;nodejs 的 npm。随着 iOS 开发者的增多&#xff0c;业界也出现了为 iOS 程序提供…

libusb中的热插拔使用举例

以下为判断usb设备是插入还是拔出状态(热插拔)的测试代码&#xff1a; 在Windows下是不支持的&#xff0c;在Linux是支持的&#xff0c;下一个版本可能会支持Windows下的热插拔&#xff1a; #include <chrono> #include <thread> #include <iostream> #incl…

C++复制控制:拷贝构造函数

一、拷贝构造函数是一种特殊构造函数&#xff0c;具有单个形参&#xff0c;该形参&#xff08;常用const修饰&#xff09;是对该类类型的引用。与默认构造函数一样 &#xff0c;拷贝构造函数可由编译器隐式调用。拷贝构造函数应用的场合为&#xff1a; &#xff08;1&#xff0…

关于IOS获取本地通讯录信息(包含iOS9.0前后)

在ios开发当中&#xff0c;获取用户本地的通讯录功能愈加频繁的出现&#xff0c;七两自己也在自己公司的项目当中遇到的获取本地的通讯录信息的功能&#xff08;俗称“种子用户功能”&#xff0c;太可怕了&#xff09;。对此七两总结了自己使用本地通讯录时的注意点&#xff0c…

C和C++安全编码笔记:动态内存管理

4.1 C内存管理&#xff1a; C标准内存管理函数&#xff1a; (1).malloc(size_t size)&#xff1a;分配size个字节&#xff0c;并返回一个指向分配的内存的指针。分配的内存未被初始化为一个已知值。 (2).aligned_alloc(size_t alignment, size_t size)&#xff1a;为一个对象…

作为一名程序员,数学到底对你有多重要?

最近在知乎上看到一个贴子&#xff0c;看完后我沉默了.....沉思后想想&#xff0c;其实每个行业都会分等级&#xff0c;程序员也不例外&#xff01;说好听一点的叫工程师&#xff0c;普通一点的叫程序员&#xff0c;差一点的叫码农&#xff0c;更差的还会叫码畜&#xff0c;码奴…

经典SQL(sqlServer)

一、基础 1、说明&#xff1a;创建数据库CREATE DATABASE database-name 2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- …

iOS UITextField输入框随键盘弹出界面上移

//点击输入框界面跟随键盘上移 - (void)textFieldDidBeginEditing:(UITextField *)textField { CGRect frame textField.frame; int offSet frame.origin.y 70 - (self.view.frame.size.height - 216.0); //iphone键盘高度为216.iped键盘高度为352 [UIView beginAnimations:…

IEEE分享 | 机器学习在领英的规模化应用

人工智能和机器学习仍然是全球持续增长的领域之一&#xff0c;近年来涌现出越来越多本科生或者非人工智能专业出身的工程师&#xff0c;他们努力学习和使用技术来改进产品&#xff0c;几乎每天都有新的机器学习技术和框架发布。这篇文章将讨论领英如何规模化利用技术&#xff0…

GitHub/GitLab/Gitee中项目互拷贝后仍保留历史提交记录的方法

GitHub、GitLab、Gitee等在同一个网站中执行复制或拷贝一个已有项目到一个新项目比较简单&#xff0c;因为它们在每一个项目上都有一个Fork按钮&#xff0c;直接点击此Fork按钮即可&#xff0c;Fork后的新项目会保留原有项目的历史提交记录。但是如果不在同一个网站上进行此操作…

基于mimeTex的数学公式Webservice的部署和实现

通过Latex语法&#xff0c;实现生成数学公式的解决方案也很多。这里介绍一种方法&#xff0c;使用开源的mimeTex。该项目的官网地址如下&#xff1a;http://www.forkosh.com/mimetex.html网站主页有一个声明。如果你的服务器上已经安装了latex&#xff0c;那么推荐使用mathTex&…

对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

AES(Advanced Encryption Standard)即高级加密标准&#xff0c;由美国国家标准和技术协会(NIST)于2000年公布&#xff0c;它是一种对称加密算法。关于AES的更多介绍可以参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/100139524 AES的GCM(Galois/Counte…

iOS UITextField清空按钮

extField.clearButtonModeUITextFieldViewModeWhileEditing; 就可以了&#xff0c;表明编辑输入框的时候启动一键清空按钮。另外&#xff0c;clearButtonMode还有三个属性&#xff1a; UITextFieldViewModeNever, 清空按钮永不出现 UITextFieldViewModeUnlessEditing, 不编…

腾讯“疯狂”开源

作者 | 马超责编 | 胡巍巍出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近日&#xff0c;腾讯自研的万亿级分布式消息中间件TubeMQ正式开源&#xff0c;并捐赠给Apache基金会&#xff0c;成为基金会官方认可的Incubator项目。我们知道与TubeMQ功能类似的kafka是领…

[Android]开发摇一摇分歧表决器过程

心血来潮&#xff0c;走进Android&#xff0c;准备开发一个摇一摇分歧表决器&#xff08;PS&#xff1a;这个想法源自去年看的一个都市剧《约会专家》中主人公杭杭开发的分歧表决器APP&#xff09;。简述&#xff1a;摇一摇分歧表决器是一款Android App&#xff0c;通过将传统的…

C和C++安全编码笔记:整数安全

5.1 整数安全导论&#xff1a;整数由包括0的自然数(0, 1, 2, 3, …)和非零自然数的负数(-1, -2, -3, …)构成。 5.2 整数数据类型&#xff1a;整数类型提供了整数数学集合的一个有限子集的模型。一个具有整数类型的对象的值是附着在这个对象上的数学值。一个具有整数类型的对象…

8.3折特惠票仅剩3天!「2019 嵌入式智能国际大会」全日程大公开!

8.3折特惠票仅剩3天立即抢购&#xff1a;https://t.csdnimg.cn/otBk还有5天&#xff0c;大伙期待的「2019嵌入式智能国际大会」正式开幕了&#xff01;2019年12月6日-7日&#xff0c;我们在深圳市人才研修院见&#xff01;大会以“万物互联泛在智能”为主题&#xff0c;邀请30位…

iOS点击空白收回键盘

//点击空白收回键盘 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; }

第一个net-mvc程序

结构 视图层 <% Page Language"C#" Inherits"System.Web.Mvc.ViewPage<dynamic>" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

iOS 储存用户信息设置封装 直接调用即可(部分是代码片段)

、、、、、、、、、、、、、、、、、、首先 定义 UserInfo #import <Foundation/Foundation.h> interface UserInfo : NSObject //用户id property (nonatomic, strong) NSString *userID; //用户名 property (nonatomic, strong) NSString *userName; //密码 propert…

ASN.1简介及OpenSSL中ASN.1接口使用举例

ASN.1(Abstract Syntax Notation One)是一套标准&#xff0c;是描述数据的表示、编码传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。OpenSSL的编码方法就是基于该标准。ASN.1是一种结构化的数字对象描述语言&#xff0c…

谁是当今最顶级的技术?SQL、Java、Python、C++ 皆上榜!

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

将表里的数据批量生成INSERT语句的存储过程 增强版

原文:将表里的数据批量生成INSERT语句的存储过程 增强版将表里的数据批量生成INSERT语句的存储过程 增强版 有时候&#xff0c;我们需要将某个表里的数据全部或者根据查询条件导出来&#xff0c;迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生…

通过OpenSSL的接口实现Base64编解码

对openssl genrsa产生的rsa私钥pem文件&#xff0c;使用普通的base64解码会有问题&#xff0c;如使用https://blog.csdn.net/fengbingchun/article/details/85218653 中介绍的方法&#xff0c;一是有可能不能从返回的结果中直接使用strlen来获得最终字符的大小&#xff0c;因为…

激辩:机器究竟能否理解常识?

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

Mac OS X 下Node.js开发环境的搭建

1.安装Xcode2.安装Homebrew 谷歌搜索Homebrew 复制命令行 打开终端 粘贴命令行 点击回车 安装 输入密码等2.安装Nodejs利用Homebrew安装nodejs打开终端 输入 &#xff1a;brew install nodejs 回车查询nodejs版本&#xff1a;node --version3.安装文档数据库 MongoDB打开终…