教你爱上Block(闭包)

block定义

// 定义
返回类型 (^block名字)(参数类型) = ^(参数){

    代码

}

简单用法

定义了Block代码块之后,就可以将一整块代码当做一个变量来使用,变量可为局部变量,也可为全局变量,这也是我认为Block最方便之处。

假设要生成两个数组,一个装有5个随机数,一个装有10个随机数,将生成随机数的方法定义为一个闭包,在后文既可直接访问,如

NSNumber *(^randArray)(void) = ^{
      int rand = arc4random() % 100;

      NSNumber *number = [NSNumber numberWithInt:rand];
      return number;
  };

  NSMutableArray *array1 = [[NSMutableArray alloc] init];
  NSMutableArray *array2 = [[NSMutableArray alloc] init];

  for (NSInteger index = 0; index<10; index++) {
      [array1 addObject:randArray];
  }

  for (NSInteger index = 0; index<5; index++) {
      [array2 addObject:randArray];
  }

回调

下面给出一 tableViewCell 上按钮事件回调的例子,这个也是很多人头痛的问题,通过block可以很方便地实现,而且层次非常清晰。

自定义cell命名为blockCell,cell上放一 switch 控件,我们希望switch被点击时在viewController中可以得到switch的状态,获取到点击事件。

blockCell.h 中定义一Block

typedef void(^switchAction)(blockCell *);
@property (nonatomic,copy)switchAction action;

在switch的点击时间事件中调用switchAction

blockCell.m

- (IBAction)switchToggle:(id)sender {
    self.action(self);
}

viewController 中使用这个自定义Cell对table进行初始化

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSString *cellID = @"blockCell";

    blockCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    cell.action = ^(blockCell *cell){
        // 既可取到行,也可取到switch状态
        NSLog(@"行数:%ld, switch state: %u", (long)indexPath.row, cell.switchBtn.on);

    };

    return cell;
}

Block封装

现在很多流行地第三方库都将回调改成了Block,之前用的Delegate特别得心应手有木有,都封装好了直接调用得到我要的结果,好了,都改成Block,不知道如何去接Block的返回值,只能一遍又一般地重写。

其实要封装很容易,将第三方库返回的Block,以一个Block来接住再返回调用的页面就可以了,本想介绍
AFNetworing后再讲这个,但是我看了下,github上他们的主页的readMe写得超级清楚详细,想要了解的童鞋请仔细看下他们的readMe

添加方式

Github地址:https://github.com/AFNetworking/AFNetworking

可以将类库拷贝到工程目录下添加,推荐用 cocoapods 安装,方便更新,而且不用手动导入framework,一键设置

封装

目的:将参数传递后调用对应的方法直接得到网络返回值

新建一个类WebRequest ,此处写一个示例,大家自己参考

#import <Foundation/Foundation.h>

#import "AFNetworking.h"

@interface WebRequest : NSObject

-(void)requestNameWithID:(NSString *)ID WithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject, NSDictionary *myData))success
                 failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

@end

@implementation WebRequest

-(void)requestNameWithID:(NSString *)ID WithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject, NSDictionary *myData))success
                 failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{

    NSURL *url = [NSURL URLWithString:@"用ID拼接地接口地址"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

        NSDictionary *dic = responseObject[@"someKey"];

        success(operation, responseObject, dic);// 此处将网络返回值传递给我们自己定义的Block中的三个返回值,dic可以自定义,也可不加,如此可以返回经自己在这里已经处理好的对象,而不必调用一次,处理一次

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        failure(operation,error);// 与方法定义中的Block一致
    }];

}

@end

调用

WebRequest *request = [[WebRequest alloc] init];

[request requestNameWithID:@"123" WithSuccess:^(AFHTTPRequestOperation *operation, id responseObject, NSDictionary *myData) {

    // 在网络成功时在这里就可以得到返回值了

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    // 网络失败回调

}];

示例工程下载

芳仔说:

现在越来越多地库使用Block,^作为Block的标志,初看会很不适应,而且在未使用的情况下会对其有抵触心理

iOS8也有相当多的Block操作,Block出现已经有两年多了,正如日中天,取代delegate 也不远了,相信大家再稍微探究使用后会爱上它的,祝大家好运!

我建的QQ交流群:130283564,欢迎半年以上经验iOS开发者加入,加群请写一句OC验证,或注明开源中国

时间: 2024-10-23 12:18:47

教你爱上Block(闭包)的相关文章

【转】教你爱上Blocks(闭包)

Block 与传统代码相比较更加轻量,调用简洁方便,而且可以返回多个参数,使用Block可以让代码更加具有易读性,而我们在写回调时,也可以直接写在函数内部,而不用再去写一个回调函数 Block 闭包 iOS Objective-C 原文 :http://my.oschina.net/joanfen/blog/317644 目录[-] Blocks 语法 Blocks 省略句式 省略返回值类型 省略参数列表 Block 类型变量 简单用法 回调 传值 Blocks是C语言的扩充功能:带有自动变量(

Objective-C中的Block(闭包)

学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也支持闭包, 也就是OC中所提到的Block. 到底什么是闭包或者block呢?用大白话说就是匿名函数,也就是在函数中可以包含这函数.就是在函数中可以定义匿名函数然后在函数中调用.学习OC中的block之前也小担心一下,Block在OC中属于高级的部分,心里有又有个疑问:学起来难不难?看过Block的

教你爱上Blocks(闭包)

传值 Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数.通过Blocks,源代码中就能使用匿名函数,即不带名称的函数.在我们 的工作中,命名占据了很大一部分,函数名,变量名,属性名,类名,框架名等都必须具备.能够编写不带名称的函数对程序员来说是具有相当吸引力的. Blocks 语法 完整形式的Blocks 与一般的C语言函数相比较,有两点不同 没有函数名 带有 ^ Blocks BN 范式 Block_literal_expression ::= ^ block_decl co

iOS 尝试用 block 闭包 去代替delegate 实现方法

通常都是这样创建alert 再加一个代理 // 创建一个UIAlertView并显示出来 UIAlertView *alertview = [[UIAlertView alloc] initWithTitle:aTitle message:msg delegate:self cancelButtonTitle:str otherButtonTitles:nil]; [alertview show]; -(void) alertView:(UIAlertView *)alertView click

Swift语法基础入门三(函数, 闭包)

Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: func 函数名称(参数名:参数类型, 参数名:参数类型...) -> 函数返回值 { 函数实现部分 } 没有参数没有返回值 可以写为 ->Void 可以写为 ->() 可以省略 Void.它其实是一个空的元组(tuple),没有任何元素,可以写成() func say() -> V

block的基本用法

block语法 1.代理协议和通知的区别 :两者的对象直接的耦合性不同.通知的代码的可读性太差.  代理,通知,block三种通信都实现了对象之间的解耦合. 通知的通信方式是1对多;代理,block是1对1 2.block(闭包):与函数相似,是一个匿名的函数代码快,此代码可以作为参数传递给其他对象 3. /* 局部的基本数据类型变量,进入到block中,num会变成常量.如果需要在block中对num进行修改,需要加上关键字__block (我们也可以用static关键字进行修饰,也可以设置成

Swift学习(2函数闭包)

函数的定义 1.函数的基础写法 func 函数名(形参列表)->返回值类型 例: func sum(x:int ,y:int) -> int{ return x+y } print(sun(x:10,y:50)) 2.外部参数的使用,就是在形参前加一个名字,外部参数不会影响函数内部细节,外部参数会让外部调用看起来更加的直观 例:func sum(num1 x:int ,num2 y:int )-> int{ return x+y } print(sum(num1:30,num2:40))

19.Swift中的闭包

import UIKit class HttpTool: NSObject { var callBack : (()->())? /* 闭包的写法: 类型:(参数列表) -> (返回值) 建议:写闭包时,记住格式直接先写 () -> () 在需要参数或者返回值,在内部填充对应的东西即可 */ func loadData(callBack : () -> ()) { self.callBack = callBack dispatch_async(dispatch_get_global

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl