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> ...
随机推荐
- 事务的使用示例及WinForm实现中的若干问题
--事务的使用示例 create database MyDB go use MyDB create table account ( Id int identity primary key, balan ...
- 全面剖析Redis Cluster原理和应用 (转)
1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子.最核心的目标有三个: 性能:这是Redis赖以生 ...
- python面向对象的继承
无话可说,继承主要是一些父类继承,代码是非常具体的 #!/usr/bin/env python #coding:utf-8 class Father(object):#新式类 def __init__ ...
- net平台下连接池
http://www.cnblogs.com/visionwang/archive/2012/11/16/2774203.html net平台下连接池概述 ADO.NET已经为我们提供这样的连接池管理 ...
- Android画图监听接口OnPreDrawListener具体解释
public static interface ViewTreeObserver.OnPreDrawListener 我们先看下API中的定义: 类概述: 为即将绘制视图树时运行的回调函数定义的接口. ...
- 【ASP.NET】怎样使用类创建公共函数,在不同ASP.NET页面间反复调用
为了降低代码冗余,应将公共函数写在类中,供不同ASP.NET页面调用. 1,先新建一个类,并在类中加入函数逻辑 namespace public_function_demo { public clas ...
- Android数据库高手秘籍(五)——LitePal的存储操作
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/39345833 经过前面几篇文章的学习,我们已经把LitePal的表管理模块的功能都 ...
- 上门洗车APP --- Androidclient开发 之 项目结构介绍
上门洗车APP --- Androidclient开发 之 项目结构介绍 前言 尽管公司项目较紧,但还是抽空给大家继续更新. o_O"~ 欢迎大家的关注,非常高兴和大家共同学习.前面给大家分 ...
- linux free
在Linux下查看内存我们一般用command free [root@nonamelinux ~]# free total used free s ...
- javascript推断的浏览器类型
<script> window["MzBrowser"]={};(function() { if(MzBrowser.platform) return; var ua ...