Block学习一门:基本使用,使用block包NSURLRequest异步请求
首先,看一下下面的代码:
void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){
NSLog(@"====%d",theOne+theTwo);
};
myFirstBlock(100,300);
void:指的时返回数据类型,myFirstBlock:指的是block的名称,后面两个是參数。
等号右边的block的实现。
个人理解:block本身就是一个类。他的实例化就是一个对象。以下看看这个数据请求的封装,来好好理解这句话。
我把数据请求这一款,封装在了:WebService这个类中,先看h文件:
<span style="font-size:14px;">//
// WebService.h
// BlockDemo
//
// Created by junyuan ji on 14-6-3.
// Copyright (c) 2014年 junyuan ji. All rights reserved.
// #import <Foundation/Foundation.h> typedef void (^successBlock)(NSMutableURLRequest * request,NSMutableData * reciveData);
typedef void (^errorBlock)(NSMutableURLRequest * request);
typedef void (^startBlock)(NSMutableURLRequest * request);
typedef void (^complectionBlock)(NSMutableURLRequest * request,NSMutableData * reciveData); @interface WebService : NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>
{
__block NSHTTPURLResponse * httpResponse;
}
@property (nonatomic,copy) successBlock successblock;
@property (nonatomic,copy) errorBlock errorblock;
@property (nonatomic,copy) startBlock startblock;
@property (nonatomic,copy) complectionBlock complectionblock;
@property (nonatomic,retain) __block NSMutableData * reciveMutableData; -(void)StartUrl:(NSString *)path; -(void)Url:(NSString *)path onSuccess:(successBlock)successBlock onError:(errorBlock)errorBlock onStart:(startBlock)startBlock onCompletion:(complectionBlock)complectionBlock;
@end</span><span style="font-size:18px;">
</span>
上面typedef是声明block,以下把block声明称属性。比方successblock是一个对象,自然能够把它声明成属性。
以下看看m文件的代码:
//
// WebService.m
// BlockDemo
//
// Created by junyuan ji on 14-6-3.
// Copyright (c) 2014年 junyuan ji. All rights reserved.
// #import "WebService.h" @implementation WebService -(void)Url:(NSString *)path onSuccess:(successBlock)successBlock onError:(errorBlock)errorBlock onStart:(startBlock)startBlock onCompletion:(complectionBlock)complectionBlock
{
[self StartUrl:path];
self.successblock = ^(NSMutableURLRequest * request,NSMutableData * reciveData){
if (httpResponse.statusCode == 200)
{
successBlock(request,reciveData);
}
};
self.startblock = ^(NSMutableURLRequest *request){
startBlock(request);
};
self.errorblock = ^(NSMutableURLRequest * request){
errorBlock(request);
};
self.complectionblock = ^(NSMutableURLRequest * request,NSMutableData * reciveData){
complectionBlock(request,reciveData);
};
}
-(void)StartUrl:(NSString *)path
{
NSURL * url = [NSURL URLWithString:path];
NSMutableURLRequest * request1 = [NSMutableURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:request1 delegate:self];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%s",__FUNCTION__);
self.errorblock((NSMutableURLRequest *)connection.currentRequest);
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"%s",__FUNCTION__);
httpResponse = (NSHTTPURLResponse *)response;
self.reciveMutableData = [NSMutableData dataWithCapacity:0];
self.startblock((NSMutableURLRequest *)connection.currentRequest);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"%s",__FUNCTION__);
[self.reciveMutableData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"%s",__FUNCTION__);
self.complectionblock((NSMutableURLRequest *)connection.currentRequest,self.reciveMutableData);
}
@end
上面这几段代码,应该好好去理解,假设上面这段代码看懂了,block基本上也就掌握了。
以下看看怎样使用封装的这个类:
#import "AppDelegate.h"
#import "WebService.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible]; void (^myFirstBlock)(int theOne,int theTwo) = ^(int theOne,int theTwo){
NSLog(@"====%d",theOne+theTwo);
};
myFirstBlock(100,300); [[[WebService alloc] init] Url:@"http://zhangmenshiting.baidu.com/data2/music/65532488/1490719597200128.mp3?xcode=f1ea4f162f276d435fc963a294370657c9d1e761819ce1d5" onSuccess:^(NSMutableURLRequest *request, NSMutableData *reciveData) {
NSLog(@"reciveData = %@",reciveData);
} onError:^(NSMutableURLRequest *request) {
NSLog(@"error = ");
} onStart:^(NSMutableURLRequest *request) {
NSLog(@"start");
} onCompletion:^(NSMutableURLRequest *request, NSMutableData *reciveData) {
NSLog(@"completion");
}]; return YES;
}
Block学习一门:基本使用,使用block包NSURLRequest异步请求的更多相关文章
- cocos2dx游戏开发——别踩白块学习笔记(一)——Block类
一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...
- leveldb 学习记录(六)SSTable:Block操作
block结构示意图 sstable中Block 头文件如下: class Block { public: // Initialize the block with the specified con ...
- display:block、display:inline与displayinline:block的概念和区别
总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...
- 如何学习一门新技术-iOS开发
如何快速学习一门新技术 以CoreBluetooth 蓝牙开发为例.我们可以从官方获得的资源有:SampleCode, Documentation,API Reference. 先从Documenta ...
- 如何深入系统的学习一门编程语言——python自学笔记
前言 最早接触python的时候,他并没有现在这么火,我也没把他太当回事,那时候我对python的印象就是给运维人员使用的一门很古老的语言,显然随着tensorflow(以下简称tf)的兴起,pyth ...
- 使用系统的某些block api(如UIView的block版本写动画时),是否也考虑循环引用问题?
系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑 以下这些使用方式不会引起循环引用的问题 [UIView animateWithDuratio ...
- 【手把手学习flutter】Flutter打Android包的基本配置和包体积优化策略
[手把手学习flutter]Flutter打Android包的基本配置和包体积优化策略 关注「松宝写代码」,回复"加群" 加入我们一起学习,天天向上 前言 因为最近参加2020FE ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- ios开发网络学习:一:NSURLConnection发送GET,POST请求
#import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...
随机推荐
- Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架
Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 ...
- C++ Primer 学习笔记_79_模板与泛型编程 --模板编译模型
模板与泛型编程 --模板编译模型 引言: 当编译器看到模板定义的时候,它不马上产生代码.仅仅有在用到模板时,假设调用了函数模板或定义了模板的对象的时候,编译器才产生特定类型的模板实例. 一般而言,当调 ...
- 启动、停止、重启 MySQL 常见的操作方法:
启动.停止.重启 MySQL 常见的操作方法: 简单罗列 一.启动方式 1.使用 service 启动:service mysqld start 2.使用 mysqld 脚本启动:/etc/inint ...
- __iomem解析
以下是在学习电池驱动中遇到的知识点之_iomem A new I/O memory access mechanism Most reasonably current cards for the PCI ...
- spring4.1+springmvc4.1+mybatis3.2.8+spring-security3.2.5集成环境建设
在最近使用的项目ssi+spring-security 结构体.建立你自己的家,这是什么环境. 只有记录的目的. 项目结构: 类文件: ...
- hdu5115(区间dp)
n头狼排成一列,每头狼有两个属性,基础攻击力和附加攻击力, 第i只狼的基础攻击力是ai,附加攻击力是b(i-1) + b(i+1) 消灭一只狼,受到的伤害为基础攻击力+附加攻击力. 问消灭所有的狼受到 ...
- Windows Phone开发(23):启动器与选择器之CameraCaptureTask和PhotoChooserTask
原文:Windows Phone开发(23):启动器与选择器之CameraCaptureTask和PhotoChooserTask 这两个组件都属于选择器,而且它们也有很多相似的地方,最明显的上一点, ...
- Android在发送带有附件的邮件
准备好工作了-下载最新的版本号JMail https://java.net/projects/javamail/pages/Home#Download_JavaMail_1.5.2_Release h ...
- EHCache的使用
在开发高并发量,高性能的网站应用系统时,缓存Cache起到了非常重要的作用.本文主要介绍EHCache的使用,以及使用EHCache的实践经验.笔者使用过多种基于Java的开源Cache组件,其中包括 ...
- UVA - 10118Free Candies(记忆化搜索)
题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每一个糖果都有颜色.每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里.假设有两个糖果颜色同样的话,就行 ...