关闭

利用block封装网络请求类

标签: IOSUIblock
272人阅读 评论(0) 收藏 举报
分类:
1.创建网络请求类NetRequest,头文件如下
typedef void(^BLOCK)(id result);

@interface NetRequest : NSObject
@property (nonatomic, copy) BLOCK bl;
- (void)requestNetWithUrl:(NSString *)urlStr BodyOfRequestForString:(NSString *)bodyStr block:(BLOCK)bl;
+ (void)PostWithUrl:(NSString *)urlStr BodyOfRequestForString:(NSString *)bodyStr block:(BLOCK)bl;
@end
解释:该处利用的是异步post传值,头文件写法基本上跟block传值一样,我这里写了一个+号方法,为的是能在使用NetRequest类的时候更加方便。可以看到这里的方法有三个参数,分别是url的地址,以及设置request的HttpBody属性的,这里属于网络请求,不做过多解释。 

2.下面看.m文件:实现俩个方法

- (void)requestNetWithUrl:(NSString *)urlStr BodyOfRequestForString:(NSString *)bodyStr block:(BLOCK)bl
{
  self.bl = bl;
  NSURL *url = [NSURL URLWithString:urlStr];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
  request.HTTPMethod = @"post";
  NSData *bodyData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
  request.HTTPBody = bodyData;
  [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options :NSJSONReadingMutableContainers error:nil];
    NSLog(@"%d", [[dic objectForKey:@"news"] count]);
    self.bl(dic);
    
}];
  
}
+ (void)PostWithUrl:(NSString *)urlStr BodyOfRequestForString:(NSString *)bodyStr block:(BLOCK)bl
{
  NetRequest *netRequest = [[NetRequest alloc] init];
  [netRequest requestNetWithUrl:urlStr BodyOfRequestForString:bodyStr block:bl];
}
解释:-方法中首先要设置属性block=参数block,再将要传的值添加到block方法的参数中。+号方法是利用-号方法将参数block传给属性block。因为在+号方法中不能直接给属性赋值。 

3.如何使用:将数据传输到ViewController上

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
    self.array = [NSMutableArray array];
    self.title = @"新闻";
    NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
    NSString *bodyStr = @"date=20131129&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213";
    [NetRequest PostWithUrl:urlStr BodyOfRequestForString:bodyStr block:^(id result) {
      self.array = [result objectForKey:@"news"];
      [self.tableView reloadData];
    }];
  }
  return self;
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view.
  self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 480) style:UITableViewStylePlain];
  [self.view addSubview:self.tableView];
  self.tableView.dataSource = self;
  self.tableView.delegate = self;
  [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuse"];
  
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *str = @"reuse";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:str];
  cell.textLabel.numberOfLines = 2;
  cell.textLabel.text = [[self.array objectAtIndex:indexPath.row] objectForKey:@"title"];
  return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  WebViewController *webVC = [[WebViewController alloc] init];
  webVC.webUrl = [[self.array objectAtIndex:indexPath.row] objectForKey:@"newsUrl"];
  [self.navigationController pushViewController:webVC animated:YES];
  [webVC release];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  return [self.array count];
}

下面来看看为什么我们要用这种传值方式:因为我要把当前获得的数据传输给一个UIViewController,而这个UIViewController上面有UITableView,需要刷新,而我们获取网络数据的时候使用的是利用block封装的一个获取NSData的方法,该方法会在数据加载完后才会执行块语句,而且网络会有延迟,我们的UI界面会优先于数据显示在手机上,所以当数据请求成功后,我们需要刷新页面,即调用UITableView的reloadData方法,所以才使用这种策略。

0
0
查看评论

block传值以及利用block封装一个网络请求类

1.block在俩个UIViewController间传值 最近刚学了几招block 的高级用法,其实就是利用block语法在俩个UIViewController之间传值,在这里分享给初学者,同时也方便我自己理解。我们知道UINavigationController类管理UIViewControll...
  • u013950854
  • u013950854
  • 2014-06-26 23:20
  • 1847

对iOS网络请求的简单封装,并且使用block回调函数方式

对iOS网络请求的简单封装,并且使用block回调函数方式,封装这种方法在编程当中真的很重要,继续学习
  • huang1032895981
  • huang1032895981
  • 2013-10-27 09:52
  • 2765

Swift版的网络请求封装

最近开始学swift,真的是欲罢不能啊。感觉比oc写起来顺手多了。呐,今天呢,和大家分享一下swift版的网络请求库Alamofire,相当于oc里的AFNetworking,用起来不要太爽哦!!!1.还是和往常一样,cocoapods导入第三方库Alamofire2.建一个管理类,继承于NSObj...
  • Three_Zhang
  • Three_Zhang
  • 2017-01-13 09:37
  • 692

iOS开发总结之block回调以AFN为基础封装的网络请求操作类

以AFN为基础封装的网络请求操作类 mgr.requestSerializer.timeoutInterval = 10;
  • sunnyboy9
  • sunnyboy9
  • 2016-04-26 00:03
  • 2126

iOS--封装网络请求 ——实例

转载自:http://blog.csdn.net/eduora_meimei/article/details/39933437 很值得收藏 一、简单说明 1.分析项目对网路请求(AFN框架)的依赖   项目中,多个控制器都使...
  • iotjin
  • iotjin
  • 2015-10-10 08:47
  • 1808

用ES6和fetch封装网络请求

try { const response = await fetch(url, requestConfig); const responseJson = await response.json(); return responseJson; } catch...
  • Boomcrow
  • Boomcrow
  • 2017-11-22 00:19
  • 200

iOS之网络请求的简单封装

#import <Foundation/Foundation.h> //定义枚举 用来标示请求的类型 typedef NS_ENUM(NSInteger,RequestType) { GET, POST }; //网络请求完成的block typedef void(^R...
  • u010390827
  • u010390827
  • 2016-05-17 22:11
  • 258

轻量级简易 Java http 网络请求的封装: SimpleHttpUtils

有时想爬一个网页链接,需要使用 HTTP 请求,那就先要对 HttpURLConnection 进行简单的封装,或者找个成熟的 Java 网络库,也要进行小小的封装。想起这些前期与主要业务逻辑无关的基础工作,可能兴趣已经不大或不太想动手了。等这些基础工作较完善的做完后,已经花去了不少时间,这也是 J...
  • xietansheng
  • xietansheng
  • 2017-04-22 23:44
  • 1821

RN实战项目网络请求封装(二)

RN实战项目网络请求封装(二)网络相关学习文档,参考 RN中文网文档RN中主要是用fetch来完成异步网络请求的,传统的ajax慢慢的会被fetch替代RN中文网fetch API 案例fetch('https://mywebsite.com/endpoint/', { meth...
  • qq_28268507
  • qq_28268507
  • 2017-04-11 10:55
  • 2463

以OKHttp为基础封装网络请求工具类

特点: 1)支持SPDY协议,共享一个socket来处理同一个服务器的所有请求。 2)无缝支持GZIP,来减少数据流量。 3)缓存相应数据来减少重复的网络请求。   网络协议: SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升...
  • chenrushui
  • chenrushui
  • 2016-09-19 18:41
  • 2082
    个人资料
    • 访问:70904次
    • 积分:1068
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:64篇
    • 译文:6篇
    • 评论:4条
    最新评论