人在千锋-网络学习第四天之网络请求:
一、Block的使用:
1、什么是block
UI开发和网络常见功能实现回调,按钮的事件处理方法是回调方法
(1)按钮target-action
(2)表格视图 传入一个指针self,回调视图控制器中的方法
(3)block,语句块,解决回调,理解为匿名函数!!
2、block的基本使用
定义block变量
定义block语句块
block传值
//Block的写法
-(void)blockBasicUse
{
//1、不带参数
void (^yourBlock)(void)=^void(){
NSLog(@"不带参数的");
};
yourBlock();
//2、带参数的block
int (^myBlock)(int,int)=^int(int x,int y){
return x+y;
};
int a=myBlock(5,3);
NSLog(@"a=%d",a);
//block捕获外部变量
int num=10;
__block int nubber=10;
void(^ b1)()=^void()
{
//block能够使用和修改实例变量
_page=1;
//block中不能修改局部变量的值
//num++;
//block中只能修改i__block修饰的局部变量
nubber++;
//有可能有循环引用警告,那么就使用下面的方法
__weak typeof(self) weakSelf=self;
weakSelf.url=@"text";
};
b1();
}
//利用block排序
Dog *ahua=[[Dog alloc]init];
ahua.nickName=@"ahua";
ahua.age=4;
Dog *amiao=[[Dog alloc]init];
amiao.nickName=@"amiao";
amiao.age=3;
Dog *dahuang=[[Dog alloc]init];
dahuang.nickName=@"dahuang";
dahuang.age=5;
NSMutableArray *arr=[[NSMutableArray alloc]initWithArray:@[ahua,amiao,dahuang]];
arr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Dog1 *adog=obj1;
Dog2 *bdog=obj2;
return adog.age-bdog.age;
}];
2、IOS开发网络基础知识:
1、一次http请求的完整过程
浏览器或者应用发起http请求,请求包含http请求(GET,POST),地址(URL),协议(HTTP/1.1),请求头部,附加信息
2、web服务器收到请求,进行处理,页面分为两种页面(静态http页面,动态php,asp,jspyem)
3、数据通过响应response返回给浏览器和应用
GET请求和POST请求的区别(面试)
(1)都是http请求的方式,GET一般只是为了获取数据,而POST获取的同时上传附加数据
(2)GET所有参数都在URL网址中,POST请求参数放在请求头中
(3)应用,知识间的获取数据,使用GET请求。
AFNetworking的介绍:
1、简介:
常见的处理网络请求方式
(1)NSURLConnect/NSURLSession
(2)ASIHttpRequest
(3) AFNetworking
GET请求
JSON下载
XML下载
POST请求
文件上传
文件下载
图片异步加载
判断网络状态
头部
ASIHttpRequest
*/
3、AFNetworking的使用:
利用AFNetworking进行网络请求
- (void)viewDidLoad
{
//1、GET请求(html,json,xml)
// [self textGetRequest];
//2、POST请求
// [self textPOSTRequest];
//3、上传文件(图片)
[self textUploadFile];
//4、下载文件
// [self textDownloadFile];
//5、监控网络状态
[self textMonitorNetworkStatus];
//6、图片异步下载(替代SDWebImage)
//#import "UIKit+AFNetworking.h"
//7.有些请求特殊的请求头
// BAIDU_WISE_UID=wapp_1428385381699_466;
//AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//[manager.requestSerializer setValue:@"wapp_1428385381699_466" forHTTPHeaderField:@"BAIDU_WISE_UID"];
}
-(void)textMonitorNetworkStatus
{
AFHTTPRequestOperationManager *manager=[[AFHTTPRequestOperationManager alloc]initWithBaseURL:[NSURL URLWithString:@"www.baidu.com"]];
//一旦网络状态改变就会调用这个block
[manager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSDictionary *dict=@{
@(AFNetworkReachabilityStatusUnknown):@"未知",
@(AFNetworkReachabilityStatusNotReachable):@"不可达",
@(AFNetworkReachabilityStatusReachableViaWWAN):@"GPRS",
@(AFNetworkReachabilityStatusReachableViaWiFi):@"wifi"
};
NSLog(@"状态为:%@",dict[@(status)]);
}];
//开启监控!
[manager.reachabilityManager startMonitoring];
}
-(void)textDownloadFile
{
NSString *urlStirng=@"http://imgcache.qq.com/club/item/avatar/zip/7/i87/all.zip";
//创建回话管理器对象(通过默认配置)
AFURLSessionManager *manager=[[AFURLSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDownloadTask *task=[manager downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlStirng]] progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
//返回下载的位置
NSString *str=[NSString stringWithFormat:@"%@/Documents/all.zip",NSHomeDirectory()];
NSLog(@"str == %@",str);
return [NSURL fileURLWithPath:str];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"
&&&&&下载完成");
}];
[task resume];
}
-(void)textUploadFile
{
//POST上传接口
NSString *urlSting=@"http://quiet.local/uploadtest/upload.php";
//上传文件的路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"12.jpg" ofType:nil];
//参数名:image :参数值就是图片
AFHTTPRequestOperationManager *manager=[AFHTTPRequestOperationManager manager];
manager.responseSerializer=[AFHTTPResponseSerializer serializer];
//实现:上传的数据附加到body中
//mimeType多用途互联网邮件扩展类型,每一种文件都有一个类型
[manager POST:urlSting parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:[NSURL fileURLWithPath:path] name:@"12.jpg" fileName:@"1212.jpg" mimeType:@"image/jpeg" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"
***************str = %@",str);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"
**************error = %@",error);
}];
}
-(void)textPOSTRequest
{
//网络接口:http://quiet.local/testdir/login.php
//参数:@"user": @"quiet"
NSString *urlString=@"http://quiet.local/testdir/login.php";
AFHTTPRequestOperationManager *mamager=[AFHTTPRequestOperationManager manager];
mamager.responseSerializer=[AFHTTPResponseSerializer serializer];//记住这一步要设置解析器为HTTP形式
//第一个参数:传入地址 第二个参数:传入URL请求的参数,格式传入字典
[mamager POST:urlString parameters:@{@"user": @"quiet",@"password":@"123"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"
-----------------str =%@",str);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"
-------------error = %@",error);
}];
}
-(void)textGetRequest
{
NSString *urlSting =@"http://www.baidu.com";
//定义AFNetworking管理
AFHTTPRequestOperationManager *manager=[AFHTTPRequestOperationManager manager];
//注意:默认认为数据是JSON,content-type 也是JSON,responseObject是解析的字典和数组。不是产生错误Code=-1016
//解决方法:设置解析器为HTTP形式的,那么下载回来就是NSData
manager.responseSerializer=[AFHTTPResponseSerializer serializer];
[manager GET:urlSting parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
//responseObject 重要参数,包含下载数据
NSString *str=[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"
================str = %@",str);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"error =%@",error);
}];
}