IOS学习 网络 AFNetworking单文件上传 取消单个队列和全部队列的方法(取消网络请求)

#import "ViewController.h"

#import "AFNetworking.h"

#import "CZNetworkTool.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // 使用 AFN ,导入 AFNetworking.h

    

    // AFHTTPRequestOperationManager开发中最常见的!负责发送网络请求.内部是对 NSUrlConnection的封装!

    

    // AFHTTPSessionManager Xcode7之后使用最多的类!内部封装的时 NSUrlSession.

    // AFHTTPSessionManager 中发送网络请求的方法名称和AFHTTPRequestOperationManager是一模一样的!

    

    // AFNetworkReachabilityManager:监测网络状态(实时监测应用当前的网络情况 3G/4G WIFI m没有网络未知的网络状态)

    

    // AFSecurityPolicy : 安全策略:用来做安全 HTTPS :安全需要服务器支持!

    

    // AFURLRequestSerialization :序列化工具:只能使用他的子类!

    // AFN 默认情况下,会解析 JSON数据!

    // 如果服务器传回来的不是 JSON数据,如要手动执行解析器类型!

}


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [selfdemo2];

}


-(void)demo2{

    // 上传文件的文件路径

    NSString *path =@"/Users/liaojianguo/Desktop/hehua.jpg";

    

    NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@"file://%@",path]];

    

    // 实例化自己写的网络工具类!目的:获得文件类型!

    CZNetworkTool *tool = [CZNetworkToolsharedNetworkTool];

    

    NSURLResponse *response = [toolgetFileTypeWithFilepath:path];

    

    NSString *type = response.MIMEType;

    

    // 使用 AFN实现文件上传!  AFN只支持单文件上传! ASI支持多文件上传!

    

    // 1.实例化网络工具管理类!

    

    AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

    

    // 2.选择请求方法,发送请求!上传: POST

    

    [manager POST:@"http://127.0.0.1/httpLogin/post/upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        

        // FileURL:需要上传的文件的文件路径!

        [formData appendPartWithFileURL:urlname:@"userfile"fileName:@"hehua"mimeType:typeerror:NULL];

        

        

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

        

        // 返回的是 OC数据!

        NSLog(@"网络请求成功: responseObject:%@",responseObject);

        

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

        //

        NSLog(@"网络请求失败");

    }];

}


// AFN 上传文件

-(void)demo1{

    // 上传文件的文件路径

    NSString *path =@"/Users/liaojianguo/Desktop/hehua.jpg";

    

    // 实例化自己写的网络工具类!目的:获得文件类型!

    CZNetworkTool *tool = [CZNetworkToolsharedNetworkTool];

    

    NSURLResponse *response = [toolgetFileTypeWithFilepath:path];

    

    NSString *type = response.MIMEType;

    

    NSData *data = [NSDatadataWithContentsOfFile:path];

    

    // 使用 AFN实现文件上传!  AFN只支持单文件上传! ASI支持多文件上传!

    

    // 1.实例化网络工具管理类!

    

    AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

    

    // 2.选择请求方法,发送请求!上传: POST

    

    // 参数1:urlString :网络接口

    // 参数2:parameters :需要上传的普通文本参数!在开发中,一般都是传递字典!

    // 参数3:^(id<AFMultipartFormData> formData):封装上传的请求参数! formData:通过设置这个值,来设置请求体中的内容(格式化之后的上传数据)

    // 参数4:success :成功之后的回调

    // 参数5:failure :失败时候的回调

    

    [manager POST:@"http://127.0.0.1/httpLogin/post/upload.php"parameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        

        // FileData:需要上传的文件的二进制数据!

        // name:服务器接受文件参数的 key!

        // fileName:文件在服务器上保存的名称!

        // mimeType:上传文件的文件类型!

        [formData appendPartWithFileData:dataname:@"userfile"fileName:@"荷花"mimeType:type];

        

        

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

        

        // 返回的是 OC数据!

        NSLog(@"网络请求成功: responseObject:%@",responseObject);

        

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

        //

        NSLog(@"网络请求失败");

    }];

}


#pragma mark - XML的解析

/**

 // 请求的数据格式,发送给服务器的格式

 self.requestSerializer = [AFHTTPRequestSerializer serializer];

 AFHTTPRequestSerializer  二进制的数据格式(默认的)

 AFJSONRequestSerializer  JSON

 AFPropertyListRequestSerializer PList

 

 // 响应的解析器(默认直接解析JSON)

 self.responseSerializer = [AFJSONResponseSerializer serializer];

 AFHTTPResponseSerializer   二进制

 AFJSONResponseSerializer   JSON  (默认的数据格式)

 AFXMLParserResponseSerializer  XML的解析器

 AFImageResponseSerializer  Image

 (处理网络图片的问题, SDWebImage)     */

- (void)getXML

{

    NSString *urlStr =@"http://127.0.0.1/max/Contents.xml";

    

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    

    // 指定我们的响应的解析器是解析XML(会返回NSXMLParser:对象)也就是需要SAX方式手动解析

        manager.responseSerializer = [AFXMLParserResponseSerializerserializer];

    

    // 假如想使用DOM进行解析XML,可以指定响应的类型是二进制。拿到二进制数据就可以进行DOM解析

//    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    

    // GET方法

    [manager GET:urlStrparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

        

        // 已经把反序列化完成的结果都直接返回了。可以更新UI

        

        NSLog(@"%@  %@", responseObject, [NSThreadcurrentThread]);

        

    } failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        

        NSLog(@"%@", error);

        

    }];

}


#pragma mark - 常规的方法

/**

 POST方法,如果需要传递参数,也可以以字典的形式传递.

 */

/**post登录*/

- (void)postLogin

{

    NSString *urlStr =@"http://127.0.0.1/httpLogin/login.php";

    

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    

    NSDictionary *params =@{@"password" :@"zhang", @"username" :@"zhangsan"};

    

    // POST方法

    [manager POST:urlStrparameters:params success:^(AFHTTPRequestOperation *operation,id responseObject) {

        

        NSLog(@"%@  %@", responseObject, [NSThreadcurrentThread]);

        

    } failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        NSLog(@"%@", error);

        

    }];

}


/**

 1. 没有URL,只需要指定一个url的字符串

 2. 网络请求是异步。完成以后的回调代码快直接是在主线程

 3. 已经实现了反序列化

 4. 如果get方法,需要传递参数,可以使用字段的方式传递。程序员不需要关心url里面的参数格式

 */

/**get登录*/

- (void)getLogin2

{

    NSString *urlStr =@"http://127.0.0.1/httpLogin/login.php";

    

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    

    NSDictionary *params =@{@"password" :@"zhang", @"username" :@"zhangsan"};

    

    // GET方法

    [manager GET:urlStrparameters:params success:^(AFHTTPRequestOperation *operation,id responseObject) {

        NSLog(@"%@  %@", responseObject, [NSThreadcurrentThread]);

    } failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        NSLog(@"%@", error);

        

    }];

}


//get方法登录,一般不用

- (void)getLogin

{

    NSString *urlStr =@"http://127.0.0.1/httpLogin/login.php?username=zhangsan&password=zhang";

    

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    

    // GET方法

    [manager GET:urlStrparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

        NSLog(@"%@  %@", responseObject, [NSThreadcurrentThread]);

    } failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        NSLog(@"%@", error);

        

    }];

}


- (void)getDemo

{

    NSString *urlStr =@"http://127.0.0.1/max/Contents.json";

    

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];

    

    // GET方法

    [manager GET:urlStrparameters:nilsuccess:^(AFHTTPRequestOperation *operation,id responseObject) {

        

        // 已经把反序列化完成的结果都直接返回了。可以更新UI

        

        NSLog(@"%@  %@", responseObject, [NSThreadcurrentThread]);

        

    } failure:^(AFHTTPRequestOperation *operation,NSError *error) {

        NSLog(@"%@", error);

        

    }];

    

    NSLog(@"完成");

    

}



 项目中有时会有这种情况,当界面正在请求数据,但数据为返回之前。返回到上一个界面,这种情况下,应取消此界面的网络请求。此篇就是为了处理此种情况下的操作,可        以取消单个请求队列,如果界面接口很多,可以一次性取消所有请求队列。

    AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

    

    NSURLSessionDataTask *ljTask = [manager GET:@"url地址"parameters:@"入参"progress:^(NSProgress *_NonnulldownloadProgress) {

        

        //数据请求进度

        

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

        

        //请求成功

        

        

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

        

        //请求失败

        

    }];

    

    //取消单个网络请求

    [ljTask cancel];

    

    //取消所有的网络请求

    [manager.operationQueuecancelAllOperations];




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值