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 有所熟悉了吧,从现在开始我们要慢慢往实际的方向走,这边就先从网络请求这部分开始,在正式开发中,网络请求一般都单独作为一部分,我们在需要使用的地方只需要 ...
随机推荐
- Java_File类讲解_打印目录树状结构_递归算法
package cn.xiaocangtian.testFile; import java.io.File; public class FileTree { public static void ma ...
- jquery 替换文本内容
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- HTTP协议请求响应过程和HTTPS工作原理
HTTP协议 HTTP协议主要应用是在服务器和客户端之间,客户端接受超文本. 服务器按照一定规则,发送到客户端(一般是浏览器)的传送通信协议.与之类似的还有文件传送协议(file transfer p ...
- C++ 系列:C++ 对象模型
1 何为C++对象模型 C++对象模型可以概括为以下2部分: 1.语言中直接支持面向对象程序设计的部分: 2.对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数.析 ...
- Eclipse中使用Maven创建web项目
一.创建一个Maven项目 1.Eclipse中用Maven创建项目 上图中点击next 2.继续next 3.选maven-archetype-webapp后,next 4.填写相应的信息,Pack ...
- Andriod学习笔记2:“Your content must have a ListView whose id attribute is 'android.R.id.list'”问题的解决办法
问题描述 activity_main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <Lin ...
- 【Mybatis架构】Mapper映射文件中的#{}与${}
前言 还记得当初从北京回来的时候,跟着倪文杰师姐做JavaITOO的一卡通模块,我亲姐贾梦洁带着我一块做,期间,我遇到了一个特别奇葩的问题,就死我要实现Mybatis的模糊查询,根据当时亲姐教给我方法 ...
- PHP常用函数、数组方法
常用函数:rand(); 生成随机数rand(0,50); 范围随机数时间:time(); 取当前时间戳date("Y-m-d H:i:s"); Y:年 m:月份 d:天 H:当前 ...
- 安卓四核PDA手持PDA智能POS机 打印二维码 分享
很多项目都会用到 类似的要求 移动手持终端 通过程序 可以生成条码或二维码 打印出小票或标签纸 下面直接上代码 希望对大家有点用处 private void print(){ csys.setTex ...
- MyEclipse创建Maven工程
先要在MyEclipse中对Maven进行设置: