Objective-C中的Block回调模式

        在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block。感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道。如果 读者之前用过SSH框架的话,看到OC中的Block回调,会感觉非常的亲切,和Java中的接口回调像极了。还是那句话,上些Block的回调代码最为直接。下面的demo是根据笔者的理解,自己设计的一个小小的Block回调的 demo,难免会有不足之处,还望批评指正,尊重原创,转载请注明出处。

        为了实现我们的Block回调,我们需要模拟一个组件(Component)和一个控制器(Controller)。在Component中我们只给出代码块的声明,不进行实现,然后在Controller中进行实现,在Component中进行调用,也就是说由组件提供代码块的形式和代码块的参数,在Controller中给出业务逻辑。可能有的小伙伴看完上面的功能描述多少会有些抽象,废话少说,代码 走起!

        1.为了更好的理解,我们就先写组件的接口部分,接口部分需要给出代码块的定义和声明,然后再提供一个外部代码块的入口函数,相当于前面目标方法回调的注册方法,再提供一个执行代码块的方法,组件的接口如下:

//  ComponentBlock.h
//  Memory
//  Created by ludashi on 14-8-19.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//

#import <Foundation/Foundation.h>
//定义Block块类型的变量
typedef void (^BlockType) (NSString *parameter);
@interface ComponentBlock : NSObject

//声明Block类型的变量
@property (nonatomic, strong)BlockType blockDemo;

//接受要回调的代码块,把接受的代码块赋给成员变量blockDemo
-(void)setBlockDemoTest:(BlockType)blockDemo;

//执行代码块的方法
-(void)runBlock;
@end

 

        2.组件的@interface写完我们就开始编写组件的实现部分了,组件的实现部分也挺简单的,就是实现我们在接口中声明的方法,我们在set方法中给block赋值,在runBlock中进行代码块的调用,组件中代码块是调用控制器中的代码块,所以称为代码块的回调,代码如下

#import "ComponentBlock.h"

@implementation ComponentBlock

-(void)setBlockDemoTest:(BlockType)blockDemo
{
    self.blockDemo = blockDemo;
}

-(void)runBlock
{
    self.blockDemo(@"我是组件提供的参数");
}

@end

 

    ​    ​3.组件写完以后我们就开始写我们的Controller方法,下面的代码是控制器中的接口部分代码,接口部分只声明了控制器启动的方法,代码如下:

#import <Foundation/Foundation.h>
@interface Controller : NSObject
-(void)start;
@end

 

    ​    ​4.控制器的实现部分是控制器的核心部分,为了实现组件的封装,我们用延展来隐藏我们组件要用到的方法,在延展中声明了我们要使用的组件,然后再实现部分进行组件的初始化和编写组件中要调用的代码块,代码块中的参数由组件提供,而控制器只提供业务逻辑控制,在控制器中我们需要 启动我们要使用的组件,也就是组件中的runBlock方法。代码如下:

#import "Controller.h"
#import "ComponentBlock.h"

//为了实现信息的隐藏我们用延展来声明组件
@interface Controller ()
//声明组件
@property (nonatomic, strong) ComponentBlock *component;
@end

//---------实现----------------

@implementation Controller
//在controller中对组件进行初始化
- (instancetype)init
{
    self = [super init];
    if (self) {
        self.component = [ComponentBlock new];
        //进行代码块的回调
        [self.component setBlockDemoTest:^void (NSString *parameter)
        {
            //打印回调的参数
            NSLog(@"%@", parameter);
        }];
    }
    return self;
}

-(void)start
{
    //调用组件的方法,执行代码块
    [self.component runBlock];
}

@end

 

    ​    ​5.Block回调的测试:在mian函数中进行控制器的实例化和启动控制器,代码如下:

@autoreleasepool {

    Controller *controller = [[Controller alloc] init];
    [controller start];

}
return 0;

 

    ​    ​代码运行结果如下:

2014-08-19 17:29:08.904 OC9-Test1[2249:303] 我是组件提供的参数

    ​以上是Block回调的小demo,读者可以和前面博客中的委托回调和目标方法回调进行一个对比,具体哪一个好用,就看读者个人所好了。Block是后来苹果公司对OC的扩充,就像PHP5.3以后也支持闭包了一样,在之前封装的组件都是用目标方法回调或委托回调实现的,至于Block回调好在哪,还得亲自使用一下才知道啊。

  上面的总结暂且这么说吧,是根据笔者自己的理解所总结的内容,不免有偏颇之处,欢迎批评指正。

时间: 2016-04-12

Objective-C中的Block回调模式的相关文章

IOS开发之自定义Button(集成三种回调模式)

前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调,Block回调.具体的内容请参考之前的博客:"Objective-C中的Block回调模式","Target-Action回调模式","Objective-C中的委托(代理)模式".在接下来要封装的button中将要用到上面的知识点.之前在做新浪微

Target-Action回调模式

        前面的博客中提到过回调的概念,是在OC通过协议来实现的回调,和Java中的接口的回调极为相似,下面来介绍另一种方法回调模式: Target-Action回调.首先我们来从字面意思来理解一下Target-Action回调模式,Target目标即我们要调用哪个目标对象中的方法.Action是行为的意思,就是我们要调用目标对象中的哪一个方法.委托回调模式之前在Java中接触过,而Target-Action回调模式笔者是第一次接触,可能是笔者道行太浅,感觉这是OC中对回调的新用法,感觉还

objc 中block回调中的__block用法

问题描述 objc 中block回调中的__block用法 刚学到objc的代码块回调,在init里回调的时候 老师在前面加了一个用__weak __block 修饰的本类的指针 copy_self= self. 然后才在代码块里用copy_self来判断和调用 比如在room里: __weak __block room * copy_self = self; 请问为什么呢?新手求解0.0 解决方案 Block 回调block回调block回调

cocos2D v3.x 中action的回调block变化

cocos2D v2.x中有带参数的回调block: id blk = [CCCallBlockN actionWithBlock:^(CCNode *node){ node.position = orign; }]; 不过到了cocos2D v3.x中只有CCActionCallBlock一种block回调了,如果需要像以前那样传递参数,可以通过局部外围变量的方法,如下: CCNode *node = myNode; id blk = [CCActionCallBlock actionWith

objective c-认证ios中的block

问题描述 认证ios中的block 在IOS中,可以使用 void*,id 或者 NSObject* 代表对象实例. 有没有方法代表ios Block?谢谢 解决方案 Block其实相当于其它一些高级语言中的"匿名函数".Block的作用是"可以将方法作为方法的参数".在一个方法中如果要传递参数,在定义方法时需要指明方法的参数类型,但有时我们想将一个方法来作为定义的方法中的参数,这时我就要用到Block了.而你问的问题"有没有方法代表ios Block?&

iOS 开发中的 Flux 架构模式

本文讲的是iOS 开发中的 Flux 架构模式, 在半年前,我开始在 PlanGrid iOS 应用程序中采用 Flux 架构(开发).这篇文章将会讨论我们从传统的 MVC 转换到Flux的动机,同时分享我们目前积累到的经验. 我尝试通过讨论代码来描述我们大部分的 Flux 实现, 它用于我们今天的产品中. 如果你只对综合结果感兴趣, 请跳过这篇文章的中间部分. 为什么从 MVC 转移 为了引入我们的决定, 我想要先谈一谈 PlanGrid 这个应用遇到的一些挑战.一些问题仅针对企业级应用程序,

全面解析Objective-C中的block代码块的使用_IOS

1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解. 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事. 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方式类似于数据结构中的栈,即后进先出.先进后出的原则. 例如:在函数中申明一个局部变量int b;系统自动在栈中为b开辟空间. 堆区(heap):一般由程序员申请并指明大小,最终也由

Node.js中使用事件发射器模式实现事件绑定详解_node.js

在Node里,很多对象都会发射事件.比如,一个TCP服务器,每当有客户端请求连接就会发射"connect"事件,又比如,每当读取一整块数据,文件系统就会发射一个"data"事件.这些对象在Node里被称为事件发射器(event emitter).事件发射器允许程序员订阅他们感兴趣的事件,并将回调函数绑定到相关的事件上,这样每当事件发射器发射事件时回调函数就会被调用.发布/订阅模式非常类似传统的GUI模式,比如按钮被点击时程序就会收到相应的通知.使用这种模式,服务端程

【MOS】RAC 环境中 gc block lost 和私网通信性能问题的诊断 (文档 ID 1674865.1)

[MOS]RAC 环境中 gc block lost 和私网通信性能问题的诊断 (文档 ID 1674865.1) 文档内容 症状   概要:   场景:   原因:   Global Cache Block Loss诊断指南 更改 原因 解决方案 参考 适用于: Oracle Database - Enterprise Edition - 版本 9.2.0.1 和更高版本本文档所含信息适用于所有平台Oracle Clusterware & Oracle Real Application Clu