NSMutableUrlRequest自定义封装网络请求

1.首先封装一个自己的网络请求的类

**这里表视图引入了第三方类库:MJRefresh 上拉刷新下拉加载

这是.h文件

#import <Foundation/Foundation.h>

typedef void(^SuccessBlock)(NSData *data);
typedef void(^ErrorBlock)(NSError *error);

@interface RequestMethod : NSObject

@property (nonatomic, copy) SuccessBlock successBlock;
@property (nonatomic, copy) ErrorBlock errorBlock;

- (void)requestWithUrl:(NSString *)urlString rewuestType:(NSString *)type dictionary:(NSString *)dictionary successBlock:(SuccessBlock)successBlock errorBlock:(ErrorBlock)errorBlock;

+ (void)requestWithUrl:(NSString *)urlString rewuestType:(NSString *)type dictionary:(NSString *)dictionary successBlock:(SuccessBlock)successBlock errorBlock:(ErrorBlock)errorBlock;

@end

.m文件:

/参数字典转换成参数字符串的方法  转码之后就会得到body的NSData对象

- (NSData *)dataFromDictionary:(NSDictionary *)dictionary {

    NSMutableArray *mArray = [[NSMutableArray alloc] initWithCapacity:0];
    for (NSString *key in dictionary) {
        NSString *string = [NSString stringWithFormat:@"%@=%@",key,dictionary[key]];
        [mArray addObject:string];
    }

    NSString *newString = [mArray componentsJoinedByString:@"&"];
    return [newString dataUsingEncoding:NSUTF8StringEncoding];

}

+ (void)requestWithUrl:(NSString *)urlString requestType:(NSString *)type dictionary:(NSDictionary *)dictionary successBlock:(SuccessBlock)successBlock errorBlock:(ErrorBlock)errorBlock {

    NetHelper *helper = [[NetHelper alloc] init];
    [helper requestWithUrl:urlString requestType:type dictionary:dictionary successBlock:successBlock errorBlock:errorBlock];

}

//请求网络的方法

- (void)requestWithUrl:(NSString *)urlString requestType:(NSString *)type dictionary:(NSDictionary *)dictionary successBlock:(SuccessBlock)successBlock errorBlock:(ErrorBlock)errorBlock {

    //因为参数中的block执行的地方是异步请求 那么在Block执行之前 方法已经走完了 那么block就会被回收 所以需要声明属性来记录传入的block 就算是方法内部的block被回收了 也可以执行
    self.successBlock = successBlock;
    self.errorBlock = errorBlock;

    NSURLSession *session = [NSURLSession sharedSession];
    //创建对象 采用可变的网络请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    //如果请求方式是POST
    if ([type isEqualToString:@"POST"]) {
        [request setHTTPMethod:type];//设置请求方式
        if (dictionary.count != 0) {
            [request setHTTPBody:[self dataFromDictionary:dictionary]];
        }

    }
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {
            self.successBlock(data);
        } else {
            self.errorBlock(error);
        }

    }];

    [task resume];

}

2.然后在表视图中使用

@interface ListTableViewController ()

@property (nonatomic, strong) NSMutableArray *dataArray;
@property (nonatomic) NSUInteger count;

@end

@implementation ListTableViewController

- (NSMutableArray *)dataArray {
    if (_dataArray == nil) {
        _dataArray = [[NSMutableArray alloc] initWithCapacity:0];
    }
    return _dataArray;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    //下拉刷新
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadUpData)];
    //上拉加载
    self.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadBottomData)];

    [self.tableView registerNib:[UINib nibWithNibName:@"MyTableViewCell" bundle:nil] forCellReuseIdentifier:@"reuse"];

        // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)loadUpData {

    [NetRequestHelper requestWithUrl:@"http://api2.pianke.me/pub/shop" requestType:@"POST" dictionary:@{@"start":[NSString stringWithFormat:@"%ld",self.count += 10]} successBlock:^(NSData *data) {
        //解析
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSDictionary *dataDic = dic[@"data"];
        //通过list这个key再取到数据保存的数组
        NSArray *array = dataDic[@"list"];
        for (NSDictionary *dic in array) {
            Model *model = [[Model alloc] init];
            [model setValuesForKeysWithDictionary:dic];
            [self.dataArray addObject:model];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView reloadData];
            //结束刷新
            [self.tableView.mj_header endRefreshing];
        });

    } errorBlock:^(NSError *error) {
        NSLog(@"刷新失败");
    }];

}
时间: 2024-12-18 12:11:02

NSMutableUrlRequest自定义封装网络请求的相关文章

[iOS微博项目 - 3.3] - 封装网络请求

github: https://github.com/hellovoidworld/HVWWeibo A.封装网络请求 1.需求 为了避免代码冗余和对于AFN框架的多处使用导致耦合性太强,所以把网络请求封装成自己的工具类,以后便于更换网络框架. 2.思路 创建一个自定义工具类,提供类方法来实现网络请求 3.实现 1 // 2 // HVWNetworkTool.h 3 // HVWWeibo 4 // 5 // Created by hellovoidworld on 15/2/9. 6 //

封装网络请求

封装网络请求类便捷, 适合多个地方使用. 第一封装下载方法 前提用Cocoapods或者直接引用第三方AFNetWorking 定义一个类NetWorkingManager, 继承于NSObject A: 在.h中写方法声明 #import <Foundation/Foundation.h> @interface NetWorkManager : NSObject - (void)downLoadWithUrl:(NSString *)url progress:(void(^)(float p

四种网络请求的方式封装网络请求

封装网络请求类便捷, 适合多个地方使用. 第一封装下载方法 前提用Cocoapods或者直接引用第三方AFNetWorking 定义一个类NetWorkingManager, 继承于NSObject A: 在.h中写方法声明 #import <Foundation/Foundation.h> @interface NetWorkManager : NSObject - (void)downLoadWithUrl:(NSString *)url progress:(void(^)(float p

App 组件化/模块化之路——如何封装网络请求框架

App 组件化/模块化之路——如何封装网络请求框架 在 App 开发中网络请求是每个开发者必备的开发库,也出现了许多优秀开源的网络请求库.例如 okhttp retrofit android-async-http 这些网络请求库很大程度上提高程序猿的编码效率.但是随着业务的发展,App 变得越来越大,我们将这些网络请求库加入到项目中直接使用,对我们业务类的入侵是非常强的.如果要进行业务分离时,这些网络请求代码将是一个阻止我们进一步工作的绊脚石.对开发者来说是非常痛苦的. 因此我们构建的网络请求框

ios中封装网络请求类

ios中封装网络请求类 #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 #import "UseXmlParser.h" //判断是否联网 #import "Reachability.h" //sbJson,判断json的解析 #import "JSON.h" @implementation JS

iOS开发项目篇—35封装网络请求

iOS开发项目篇—35封装网络请求 一.简单说明 1.分析项目对网路请求(AFN框架)的依赖 项目中,多个控制器都使用了AFN框架发送网络请求,如果AFN2.0存在重大BUg,或者是升级至3.0版本,那么对于整个项目都是及其危险的,所有用到AFN的地方都需要做出相应的修改. 另外,如果现在要求不再使用AFN框架,而是使用一个新的框架,那么有关AFN的依赖所关联的所有代码都需要重新来过. 如果把afn这个第三方框架从项目中删除的话,那么项目就相当于作废了,这就是项目对第三方框架的强依赖的体现. 说

事件传递参数-封装网络请求api

1==>通过点击事件进行传递参数 <view bindtap="goEdution" data-index="5">西南大学</view> <view bindtap="goEdution" data-index="6">北京师范</view> <view bindtap="goEdution" data-index="7"&g

微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据

§ 封装网络请求及 mock 数据 本文配套视频地址:https://v.qq.com/x/page/i0554... 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发工具 上一节中,我们对 index.js 文件中增加了 util 对象,并在对象中封装了很多公用方法 let util = { log(){--}, alert(){--}, getStorageData(){--}, setStorageData(){--} } 本节中,我们对常用的网络请求方法 wx.reques

用Block封装网络请求

#import <Foundation/Foundation.h> // 定义一个枚举typedef NS_ENUM(NSInteger) {    LY_GET,    LY_POST} URLRequestMethod;///定义返回block网络请求结果typedef void(^ResultBlock)(NSData *data,NSURLResponse *response,NSError *error); @interface LYNetWorkRequestManager : N