首先,看一下下面的代码:

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异步请求的更多相关文章

  1. cocos2dx游戏开发——别踩白块学习笔记(一)——Block类

    一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...

  2. leveldb 学习记录(六)SSTable:Block操作

    block结构示意图 sstable中Block 头文件如下: class Block { public: // Initialize the block with the specified con ...

  3. display:block、display:inline与displayinline:block的概念和区别

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  4. 如何学习一门新技术-iOS开发

    如何快速学习一门新技术 以CoreBluetooth 蓝牙开发为例.我们可以从官方获得的资源有:SampleCode, Documentation,API Reference. 先从Documenta ...

  5. 如何深入系统的学习一门编程语言——python自学笔记

    前言 最早接触python的时候,他并没有现在这么火,我也没把他太当回事,那时候我对python的印象就是给运维人员使用的一门很古老的语言,显然随着tensorflow(以下简称tf)的兴起,pyth ...

  6. 使用系统的某些block api(如UIView的block版本写动画时),是否也考虑循环引用问题?

    系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑 以下这些使用方式不会引起循环引用的问题 [UIView animateWithDuratio ...

  7. 【手把手学习flutter】Flutter打Android包的基本配置和包体积优化策略

    [手把手学习flutter]Flutter打Android包的基本配置和包体积优化策略 关注「松宝写代码」,回复"加群" 加入我们一起学习,天天向上 前言 因为最近参加2020FE ...

  8. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

  9. ios开发网络学习:一:NSURLConnection发送GET,POST请求

    #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...

随机推荐

  1. Boost中timer的简易用法

    boost::asio::deadline_timer timer_; timer_(io_service), timer_.expires_from_now(boost::posix_time::s ...

  2. hdu2712(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2712 题意:是求最短的非子串(子串不要求连续)的长度. 分析:把序列划分为尽量多(假设为ans)的含有 ...

  3. 画师绘制《进击的巨人》电影版海报 堪比好莱坞- Micro Reading

    http://m.baidu.com/from=844b/bd_page_type=1/ssid=0/uid=3151E6C0905477A13653132D762BB6FB/pu=sz%401320 ...

  4. 〖Groovy〗语言使用贴士(Tips)(转)

    [Groovy]是一门运行在[JVM]之上的动态语言.由[James Strachan]和[Bob McWhirter]于2003年启动开发,之后于2004年3月成为[JSR 241](Java Sp ...

  5. HDU 3304 Interesting Yang Yui Triangle lucas定理

    输入p n 求杨辉三角的第n+1行不能被p整除的数有多少个 Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0] ...

  6. c++ 对象指针参数和对象引用参数02

    对象指针作为函数参数和对象引用作为函数参数都比对象作为函数参数要用的更为普遍 传对象指针和传对象引用作为实参,那么实参在函数里发生了变话,那么相应的对象本身也会发生变化,二传递对象本身作为实参的话,实 ...

  7. linux--档案权限与目录配置

    下面是最近学习档案权限与目录配置的一些知识点总结***博客园-邦邦酱好*** Linux最优秀的地方之一,就在于他的多人多任务环境.而为了让各个使用者具有较保密的档案数据,因此档案的权限管理就变的很重 ...

  8. 使用OGG&quot;Loading data from file to Replicat&quot;的方法应该注意的问题:replicat进程是前台进程

    使用OGG的 "Loading data from file to Replicat"的方法应该注意的问题:replicat进程是前台进程 因此.最好是在vncserver中调用该 ...

  9. include设置属性在relativelayout布局中无效

    转自:http://4265337.blog.163.com/blog/static/195375820127935731114/ 再来说一个在使用这两个标签时最容易出现的问题. 经常会有同学在Rel ...

  10. Delphi F11 全屏

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...