iOS相关技术的博客一大堆,没有好的内容我不想写。最近在迭代公司的项目版本。这个话题我想了很久,也看了很多类似的文章,决定记录下来。网络请求是客户端开发中非常重要的一个模块。关于这方面有很多事情要了解。本文只介绍我用过的相关框架。AF网络1。关于AFNetworking,只要是做iOS开发的,都应该知道这个框架。我不会详细说明它有多好。从iOS9开始,Apple放弃了NSURLConnection,只使用NSURLSession,所以AFN从3.0版本开始就删除了所有基于NSURLConnectionAPI的支持,基于NSURLSession框架和NSOperation的封装开发。2、由于基于AFNetworking的网络请求使用了第三方框架,所以肯定有一定的局限性。框架的迭代更新会影响到我们的代码,所以尽可能解耦,一般我们会单独写一个网络请求工具类来封装框架。这样即使框架发生变化,也只需要改动工具类的相关代码即可。A。新建一个网络请求工具类,实例化AFHTTPSessionManager。类似如下:+(instancetype)sharedInstance{staticdispatch_once_tonceToken;dispatch_once(&onceToken,^{_mutParamares=[NSMutableDictionarydictionary];_manager=[AFHTTPSessionManagermanager];_manager.requestSerializer=[AFHTTPRequestSerializerserializer];_manager.requestSerializer.timeoutInterval=30.0f;[AFNetworkActivityIndi??catorManagersharedManager].enabled=YES;_manager.responseSerializer.acceptableContentTypes=[NSSetsetWithObjects:@"application/json",@"text/html",@"text/json",@"text/plain",@"text/javascript",@"text/xml",@"image/*",nil];});}两个需要注意的问题:***,这里的网络请求工具类是单利,为什么要用单利?[AFHTTPSessionManagermanager]追查到这个方法,会发现返回的manager并不简单,如果每次请求都实例化一个manager,可能会造成内存泄漏。第二,有时候请求失败的原因是AFN支持的响应类型和服务器返回给我们的类型不一致。修改AFN需要修改源码,但是使用Cocoapods管理三方框架,pod更新后修改的代码会被重写。地方。此时,您可以根据需要通过acceptableContentTypes属性进行设置。+(instancetype)manager{return[[selfalloc]initWithBaseURL:nil];}也可以通过requestSerializer属性设置请求头相关信息。如:[self.manager.requestSerializersetValue:@""forHTTPHeaderField:@""];b.常用的网络请求类型。这是一个对外的API,外部通过调用这些接口来实现相关的网络请求。当然你也可以根据自己的需要对外暴露相关的API。对应的接口实现比较简单。具体逻辑也要根据业务需求在外部实现。文件操作,比如上传图片,可以参考下面的代码。image.png//上传多张图片:dataname:@"file"fileName:[NSStringstringWithFormat:@"img%ld.png",i]mimeType:@"image/png"];}];上传多张图片时,根据需要图片即可裁剪和压缩。上传进度可以通过progressBlock返回显示在相应的UI上。进度计算公式如下。processBlock(progress.completedUnitCount/progress.totalUnitCount);C。监控网络状态。AFNetworkReachabilityManager*manager=[AFNetworkReachabilityManagersharedManager];[managersetReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatusstatus){switch(status){caseAFNetworkReachabilityStatusUnknown:break;caseAFNetworkReachabilityStatusNotReachable:break;caseAFNetworkReachabilityStatusReachableViaWWAN:break;caseAFNetworkReachabilityStatusReachableViaWiFi:break;}}];[managerstartMonitoring];以上是基于AFNetworking的网络请求。上面提到的网络请求方法是一个密集型网络请求,即所有的API都调用这个工具类。另一种网络请求方式是离散的,即每个API都有自己对应的类。YTKNetwork1。YTKNetwork的框架也是基于AFNetworking重新封装的,适用于大型项目。YTKNetwork是一种离散的网络请求方法。上面说到每个请求对应一个对象,可以根据需要自定义对应的请求。另外,YTKNetwork支持批量发送网络请求和设置统一回调,支持相互依赖的网络请求等功能。2、基于YTKNetwork进行网络请求如上,不建议直接使用第三方,写一个BaseRequest类继承YTKRequest,在该类中实现如下方法。此方法是所有请求的响应。-(void)startWithCompletionBlockWithSuccess:(YTKRequestCompletionBlock)successfailure:(YTKRequestCompletionBlock)failure{}b。写一个网络请求配置类。程序启动时通过YTKNetworkConfig配置网络请求。比如baseUrl参数等。通过YTKNetworkAgent设置一些参数,比如上面提到的acceptableContentTypes参数。该类是真正发起请求的类,也在该类中处理AFN。_config=[YTKNetworkConfigsharedConfig];_config.baseUrl=BASE_INTERFACE_URL_DEV;YTKNetworkAgent*agent=[YTKNetworkAgentsharedAgent];NSSet*acceptableContentTypes=[NSSetsetWithObjects:@"application/json",@"text/json",@"text/javascript",@"text/plain",@"text/html",@"text/css",nil];NSString*keypath=@"jsonResponseSerializer.acceptableContentTypes";[agentsetValue:acceptableContentTypesforKeyPath:keypath];3.以具体的API(requestUserinformation)请求为例。3.1新建一个UserInfoAPI类,继承你写的BaseRequest类。3.2实施以下方法。请求的URL与外界无关,不需要从外界传入。请求的类型和请求的参数。当然也可以在API类内部实现解析。通过在GET方法中实现数据转换和分析。-(NSString*)requestUrl{returnkUserURL;}-(YTKRequestMethod)requestMethod{returnYTKRequestMethodPOST;}-(instancetype)requestArgument{returnparameter;}serverRespData是基类自定义的参数,是数据过滤后的响应。_serverRespData=[self.responseJSONObjectobjectForKey:@"data"];-(QDZQUseModel*)user{//重写user的get方法。_user=[QDZQUserEntityyy_modelWithDictionary:[self.serverRespDataobjectForKey:@"appUser"]];return_user;}3.3如何调用这个API+(void)fetchUserInfoSuccess:(void(^)(void))successfailure:(void(^)(NSError*错误))失败{UserInfoApi*api=[[UserInfoApialloc]init];[apistartWithCompletionBlockWithSuccess:^(__kindofYTKBaseRequest*_Nonnullrequest){if(success){}}失败:^(__kindofYTKBaseRequest*_Nonnullrequest){if(failure){}}];}3.4添加请求头如果需要添加请求头,可以实现如下方法。-(nullableNSDictionary
