iOS开发——post异步网络请求封装
IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的。
在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子。我这里要给出的封装代码,是异步的,post的请求方式。通过ios的原生函数简单封装。通过这个封装可以方便的访问http服务器,获取数据,也可以容易的异步加载网络图片。
首先新建一个httpHelper类,在这个类里进行封装,封装的函数名称就叫做post,参数有请求的地址url,请求的参数params,返回数据后回调的函数block。第三个参数使用了objective-c的block特性,就是把一个函数当做参数传给另一个函数。感兴趣的可以去看看。
下面首先是头文件。
// HttpHelper.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "Reachability.h" @interface HttpHelper : NSObject + (BOOL)NetWorkIsOK;//检查网络是否可用
+ (void)post:(NSString *)Url RequestParams:(NSDictionary *)params FinishBlock:(void (^)(NSURLResponse *response, NSData *data, NSError *connectionError)) block;//post请求封装 @end
接下来是实现文件
// HttpHelper.m
#import "HttpHelper.h" @implementation HttpHelper //这个函数是判断网络是否可用的函数(wifi或者蜂窝数据可用,都返回YES)
+ (BOOL)NetWorkIsOK{
if(
([[Reachability reachabilityForInternetConnection] currentReachabilityStatus]
!= NotReachable)
&&
([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus]
!= NotReachable)
){
return YES;
}else{
return NO;
}
} //post异步请求封装函数
+ (void)post:(NSString *)URL RequestParams:(NSDictionary *)params FinishBlock:(void (^)(NSURLResponse *response, NSData *data, NSError *connectionError)) block{
//把传进来的URL字符串转变为URL地址
NSURL *url = [NSURL URLWithString:URL];
//请求初始化,可以在这针对缓存,超时做出一些设置
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:];
//解析请求参数,用NSDictionary来存参数,通过自定义的函数parseParams把它解析成一个post格式的字符串
NSString *parseParamsResult = [self parseParams:params];
NSData *postData = [parseParamsResult dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPMethod:@"POST"];
[request setHTTPBody:postData]; //创建一个新的队列(开启新线程)
NSOperationQueue *queue = [NSOperationQueue new];
//发送异步请求,请求完以后返回的数据,通过completionHandler参数来调用
[NSURLConnection sendAsynchronousRequest:request
queue:queue
completionHandler:block];
// return result;
} //把NSDictionary解析成post格式的NSString字符串
+ (NSString *)parseParams:(NSDictionary *)params{
NSString *keyValueFormat;
NSMutableString *result = [NSMutableString new];
//实例化一个key枚举器用来存放dictionary的key
NSEnumerator *keyEnum = [params keyEnumerator];
id key;
while (key = [keyEnum nextObject]) {
keyValueFormat = [NSString stringWithFormat:@"%@=%@&",key,[params valueForKey:key]];
[result appendString:keyValueFormat];
NSLog(@"post()方法参数解析结果:%@",result);
}
return result;
} @end
就是这么简单。下面用 登录的例子 给大家演示一下是怎么用的。
- (void)login{
NSString *url = @"127.0.0.1/login.php";
NSString *userName = @"admin";
NSString *password = @"root";
//加入参数
NSMutableDictionary *params = [NSMutableDictionary new];
[params setValue:userName forKey:@"phone"];
[params setValue:password forKey:@"password"];
//有网络才发送请求
if([HttpHelper NetWorkIsOK]){
//发送请求,并且得到返回的数据
[HttpHelper post:url RequestParams:params FinishBlock:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//传回来的数据存在,则执行改回调甘薯
if(data){
//子线程通知主线程更新UI,selector中是要执行的函数,data是传给这个函数的参数
//login_callBack就处理返回来的消息,这里就简单的输出,登录成功
[self performSelectorOnMainThread:@selector(login_callBack:) withObject:data waitUntilDone:YES];
}else{
NSLog(@"无效的数据");
}
}];
}
}
//登录的回调函数,首先判断接收的值是不是能登录。若不能,则提示用户。若能登录,则处理segue来跳转界面
- (void)login_callBack:(id)value{
NSLog(@"登录成功");
}
整个例子就是这样,很简单,也可以请求图片,然后在回调函数中执行存取图片,显示在imageview中之类的操作
iOS开发——post异步网络请求封装的更多相关文章
- iOS 多个异步网络请求全部返回后再执行具体逻辑的方法
对于dispatch多个异步操作后的同步方法,以前只看过dispatch_group_async,看看这个方法的说明: * @discussion * Submits a block to a dis ...
- Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...
- iOS NSURLConnection和异步网络请求
在日常应用中,我们往往使用AFNetworking等第三方库来实现网络请求部分.这篇文章会简要地介绍一下如何使用NSURLConnection来进行异步的网络请求. 我们先看一个小demo - (vo ...
- ios 关于使用异步网络请求时block回调的内存注意
在一个controller中,使用 NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest ...
- iOS开发 GET、POST请求方法(NSURLSession篇)
NSURLConnection,在iOS9被宣布弃用,本文不使用NSURLConnection进行网络编程,有兴趣的童鞋可以参考: [iOS开发 GET.POST请求方法(NSURLConnectio ...
- iOS开发 GET、POST请求方法(NSURLConnection篇)
Web Service使用的主要协议是HTTP协议,即超文本传输协议. HTTP/1.1协议共定义了8种请求方法(OPTIONS.HEAD.GET.POST.PUT.DELETE.TRACE.CONN ...
- iOS开发 GET、POST请求方法:NSURLSession篇
NSURLConnection,在iOS 9被宣布弃用,本文不使用NSURLConnection进行网络编程,有兴趣的童鞋可以参考: iOS开发 GET.POST请求方法(NSURLConnectio ...
- IOS9中使用NSURLConection发送异步网络请求
IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...
- React-Native 之 GD (八)GET 网络请求封装
1.到这里,相信各位对 React-Native 有所熟悉了吧,从现在开始我们要慢慢往实际的方向走,这边就先从网络请求这部分开始,在正式开发中,网络请求一般都单独作为一部分,我们在需要使用的地方只需要 ...
随机推荐
- jquery动态合并表格行
利用<td rowspan = "num"/>;原理来实现,其中num为要合并的行数. <!DOCTYPE html> <html> <h ...
- WPF 通过Border来画边框
WPF有自己的表格控件DataGrid.ListBox等,如果只是简单的需求,可以通过Border控件来画边框. 比如我们需要给上面的控件加上边框. <Window x:Class=" ...
- PHP单例模式
//1.单例模式//目的:为了控制对象的数量(只能够有一个,相当于类的计划生育)//做法//1.将类的构造函数做成私有的//2.在类里面做了一个公有的函数来造对象//3.将该函数变为静态的//4.在函 ...
- OC推箱子
#include<stdio.h> #include<stdlib.h> int main(void) { char sr;//存储用户输入的指令 //绘制地图 char a[ ...
- 设置SQL server服务器的dbo架构
服务器登录名,指有权限登录到某服务器的用户: 服务器角色,指一组固定的服务器用户,默认有9组: 登录名一定属于某些角色,默认为public 服务器角色不容许更改 登录后也不一定有权限操作数据库 数据库 ...
- jQuery的DOM操作详解
DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...
- 关于Telerik RadGridView 数据列拖动后异常的一种情况
目的: 想实现带有复杂表头(ColumnHeader)的列的动态加载,写了一个用户控件. 问题: 动态加载成功了,显示正常,滚动条也正常,但是一旦进行列的拖动操作之后,程序就挂掉了. 解决尝试: 反复 ...
- maven执行报错resolution will not be reattempted until the update interval of nexus h
maven在执行过程中抛错: 引用 ... was cached in the local repository, resolution will not be reattempted until t ...
- ASP.NET中GridView数据导出到Excel
/// <summary> /// 导出按钮 /// </summary> /// <param name="sender"></para ...
- php js数组问题
<script type="text/javascript"> var a = new Array(); a = "a"; a = "b& ...