iOS中使用block进行网络请求回调

HttpRequest.h

  1. //
  2. // HttpRequest.h
  3. // UseBlockCallBack
  4. //
  5. // Created by Michael on 2/13/14.
  6. // Copyright (c) 2014 EIMS. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. typedef void (^FinishBlock)(NSString *dataString);
  12.  
  13. @interface HttpRequest : NSObject<NSURLConnectionDataDelegate>
  14.  
  15. @property (strong, nonatomic) NSMutableData *resultData;
  16. @property (strong, nonatomic) FinishBlock finishBlock;
  17.  
  18. + (void)postRequestWithURL:(NSString *)urlStr
  19. paramters:(NSString *)paramters
  20. finshedBlock:(FinishBlock)block;
  21.  
  22. @end

  HttpRequest.m

  1. //
  2. // HttpRequest.m
  3. // UseBlockCallBack
  4. //
  5. // Created by Michael on 2/13/14.
  6. // Copyright (c) 2014 EIMS. All rights reserved.
  7. //
  8.  
  9. #import "HttpRequest.h"
  10.  
  11. @implementation HttpRequest
  12.  
  13. + (void)postRequestWithURL:(NSString *)urlStr
  14. paramters:(NSString *)paramters
  15. finshedBlock:(FinishBlock)block
  16. {
  17. HttpRequest *httpRequest = [[HttpRequest alloc]init];
  18. httpRequest.finishBlock = block;
  19.  
  20. NSURL *url = [NSURL URLWithString:urlStr];
  21. NSMutableURLRequest *requset = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
  22. [requset setHTTPBody:[paramters dataUsingEncoding:NSUTF8StringEncoding]];
  23.  
  24. NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:requset delegate:httpRequest];
  25. NSLog(connection ? @"连接创建成功" : @"连接创建失败");
  26. }
  27. /**
  28. * 接收到服务器回应的时回调
  29. */
  30. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  31. {
  32. NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
  33. if (!self.resultData) {
  34. self.resultData = [[NSMutableData alloc]init];
  35. } else {
  36. [self.resultData setLength:0];
  37. }
  38.  
  39. if ([response respondsToSelector:@selector(allHeaderFields)]) {
  40. NSDictionary *dic = [httpResponse allHeaderFields];
  41. NSLog(@"[network]allHeaderFields:%@",[dic description]);
  42. }
  43. }
  44. /**
  45. * 接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
  46. */
  47. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  48. {
  49. [self.resultData appendData:data];
  50. }
  51. /**
  52. * 数据传完之后调用此方法
  53. */
  54. - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  55. {
  56. NSString *resultStr = [[NSString alloc]initWithData:self.resultData
  57. encoding:NSUTF8StringEncoding];
  58. if (self.finishBlock) {
  59. self.finishBlock(resultStr);
  60. }
  61. }
  62. /**
  63. * 网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法
  64. */
  65. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  66. {
  67. NSLog(@"network error : %@", [error localizedDescription]);
  68.  
  69. if (self.finishBlock) {
  70. self.finishBlock(nil);
  71. }
  72. }
  73.  
  74. @end

  在ViewController中调用:

  1. [HttpRequest postRequestWithURL:@"http://www.baidu.com"
  2. paramters:@""
  3. finshedBlock:^(NSString *dataString) {
  4. NSLog(@"finish callback block, result: %@", dataString);
  5. }];

  

iOS中使用block进行网络请求回调的更多相关文章

  1. iOS中4种判断网络请求的方式(系统状态栏、AFNetworking、Reachability、自定义)

    iOS 实时判断网络状态 方法一:利用系统状态栏判断网络状态 // 状态栏是由当前app控制的,首先获取当前app UIApplication *app = [UIApplication shared ...

  2. iOS中使用 Reachability 检测网络

    iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测.   写本文的目的 了解Reachability都 ...

  3. iOS中GET 和 POST 数据请求

    iOS中GET 和 POST 网络数据请求 同步请求和异步请求的差别: 1.同步请求,有主线程完成网路请求任务,在数据没有请求之前,用户的所有的交互事件应用都无法处理,会造成一种卡顿现象,影响用户体验 ...

  4. IOS中的Block与C++11中的lambda

    ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...

  5. iOS 中使用Block时需要注意的retain circle

    现在在ios中,block是越来越多了.自己在类中定义block对象时,需要注意block对象的使用方法,防止产生retain circle,导致内存泄露. 现在分析一下产生retain circle ...

  6. IOS开发之自动布局显示网络请求内容

    在上一篇博客中详细的介绍了IOS开发中的相对布局和绝对布局,随着手机屏幕尺寸的改变,在App开发中为了适应不同尺寸的手机屏幕,用自动布局来完成我们想要实现的功能和效果显得尤为重要.本人更喜欢使用相对布 ...

  7. android 项目中使用到的网络请求框架以及怎样配置好接口URL

    我们在做项目中一定少不了网络请求,如今非常多公司的网络请求这块好多都是使用一些比較好的开源框架,我项目中使用的是volley,如今讲讲一些volley主要的使用,假设想要具体的了解就要去看它的源代码了 ...

  8. iOS 技术篇:如何处理多个网络请求的先后(依赖)关系

    在开发过程中,不知你有没有碰到过在一个页面 用到了多个网络请求,而且根据业务需求,需要有次序的执行A B C 网络请求? 你可能会想到,我在A的请求成功回调里去处理B,在B的回调里去请求C,但你后来会 ...

  9. iOS中为什么block用copy属性

    1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...

随机推荐

  1. iOS炫酷动画图案、多种选择器、网络测速、滑动卡片效果等源码

    iOS精选源码 对网络进行测速 自实现大标题,配合原生骨架屏demo 简单方便的pickerVIew记录数据 LZPickerView 科技风绘制组件,简单快速"画"出炫酷图案 R ...

  2. MOOC(14)- 从数据库中获取预期结果

    数据库中的预期结果写的是SQL语句 从表格中读取到SQL语句,再去数据库获取真正的预期结果 # -*- coding: utf-8 -*- # @Time : 2020/2/18 9:50 # @Fi ...

  3. python语法基础-面向对象-基础-长期维护

    ###############    类的基本操作    ############## """ 类的基本认识: 1,类就是一个模子 2,dict,list都是类,具体的一 ...

  4. django框架基础-django模板语言-长期维护

    ##################     常用的模板语言       ####################### # django的模板语言, # # 只需要记两种特殊符号: # # {{ } ...

  5. 方差分析|残差|MSA/MSE|Completely randomized design|Randomized block design|LSD|主效应|intercept|多重比较|

    符合方差分析的三个条件: 残差=实际值-预测值(其实是均值). 在原假设下,MSA的期望会等于MSE的期望:在备选假设下,MSA的期望会大于MSE的期望,所以MSA/MSE的取值范围在(1,正无穷), ...

  6. Spring+Mybais整合

    简单的来说,Spring主要用于在业务层(当然spring也有数据库交互的模块,个人觉得spring在这方面有一点不如mybatis),而mybatis主要用于数据持久化,在一个完整的项目中无论是业务 ...

  7. SQL中的一些关键字用法

    1.where 条件筛选结果 select * from `表名` where `列名`='value' 上诉语句的意思是在某表中查询某列名等于某特定值得所有列 2.Like 模糊查询 select ...

  8. 一、美国国家经济研究局NBER教育经济研究项目工作论文合集

    一.美国国家经济研究局NBER教育经济研究项目工作论文合集 (一)项目地址: American National Bureau of Economic Research - Economics of ...

  9. FPGA开平方的实现

    3种方法: 1.JPL近似的实现方法 `timescale 1ns / 1ps )( clk, syn_rst, dataa, datab, ampout); input clk; :] dataa; ...

  10. Python:扫描目录下的所有文件

    扫描目录下的所有文件并返回文件的绝对路径 def fileListFunc(filePathList): fileList = [] for filePath in filePathList: for ...