block简单用法 与传统回调 ---写的不错文章

Block的用法总结——写回调.


block是个什么玩意儿

Block是Apple Inc.为C、C++以及Objective-C添加的特性,使得这些语言可以用类lambda表达式的语法来创建闭包 ——维基百科

A block is an anonymous inline collection of code, and sometimes also called a "closure". ——Apple文档

闭包就是能够读取其它函数内部变量的函数。

这里简单总结一下用法。block的用法有很多种,最常用的有 回调 和 遍历 。这篇主要说 回调

  1. 回调

    什么是回调

    在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。 ——维基百科

    回调就是说,我一个操作执行完成之后,提供给调用者一个接口,供调用者定义一些操作。obj-C的代理模式就是典型的回调。

    举个简单的block例子:

     @interface People : NSObject
    
     -(void)runningOutOfMoneyUsingBlock:(void (^)(void))aBlok;
    
     @end
    
    
     @implementaiton People
    
     -(void)runningOutOfMoneyUsingBlock:(void (^)(void))aBlok
     {
         NSLog(@"I have run out of my money");
         aBlock();     //(1)
     }
    
     @end
    

    这个时候, 就定义了一个带block参数的方法。这是一个很简单的block参数, 没有返回值, 没有参数。

    当我们调用这个方法的时候,只需这样操作:

     Peopeo *aPeople = [[People alloc] init]];
     [aPeople runningOutOfMoneyUsingBlock:^{
    
         NSLog(@"Earn more money!");
    
     }];
    

    这时在执行People类方法的时候,执行结果如下:

     “I have run out of my mondy”
     "Earn more money!"
    

    很好理解,People的类方法有一个block参数。调用者在调用该方法的时候为block参数定义了若干操作(这里是输出一句话),然后将这些操作作为参数传递给类方法内部执行.调用者所定义的这些操作执行的位置,取决于"(1)"所处的位置。

    如果将类方法的实现改变为:

     -(void)runningOutOfMoneyUsingBlock:(void (^)(void))aBlok
     {
         aBlock();     //(1)
         NSLog(@"I have run out of my money");
     }
    
     @end
    

    那么运行结果就会变为:

     "Earn more money!"
     “I have run out of my money”
    

    下面来说一说block 带参数 的情况,有People类方法定义如下:

     @interface People : NSObject
    
     -(void)runningOutOfMoneyUsingBlock:(void (^)(int a, int b))aBlok;
    
     @end
    
     @implementaiton People
    
     -(void)runningOutOfMoneyUsingBlock:(void (^)(int a, int b))aBlok
     {
         NSLog(@"I have run out of my money");
         int a = 10;
         int b = 50
         aBlock(a,b);     //(2)
     }
    
     @end
    

    在这个类方法中,对之前的People类方法的block参数进行了扩展,加入了两个整形参数:a和b。在调用block之前为a和b赋值并且传给了block,形如(2)。

    这个时候,当我们在调用这个类方法的时候,就会出现这样的情况:

     Peopeo *aPeople = [[People alloc] init]];
     [aPeople runningOutOfMoneyUsingBlock:^(int a, int b){
    
         NSLog(@"a = %d, b = %d", a, b);
    
     }];
    

    执行结果如下:

     "Earn more money!"
     "a = 10, b = 50"
    

    不难看出,People将自己内部的两个局部变量, 通过block传递给了调用者。这一点很好理解,想想我们经常使用的 代理方法 就可以了。

    以UITableView的代理方法为例,代理方法定义如下

     - (void)tableView(UITableView *):tableView didSelectRowAtIndexPath:(NSIndexPath)indexPath;
    

    这个方法用来给某个section指定行数。私以为这个方法可以换为如下block实现。

     @interface UITableView (WithBlock)
    
     -(void)didSelectRowAtIndexPathUsingBlock:(void (^)(UItableView *tableView, NSIndxPath *indexPath))selectBlock;
    
     @end
    
    
     @implementation UITableView (WithBlock)
    
     -(void)didSelectRowAtIndexPathUsingBlock:(void (^)(UItableView *tableView, NSIndxPath *indexPath))selectBlock
     {
         //some other code
         ...
         if(selectBlock) {
             selectBlock(self, indexPath);
         }
    
         …
         //some other code
     }
    
     @end
    

    好吧, 我承认这里给出这样的方法有点儿蹩脚,仅仅是为了对比Block和代理的相似之处。回想一下代理的实现,block是一样的原理。

    block还可以有返回值,将block在调用者处执行的结果返回给方法本身。例如,再对以上实例方法进行扩展,代码如下:

      @interface People : NSObject
    
     -(void)runningOutOfMoneyUsingBlock:(int (^)(int a, int b))aBlok;
    
     @end
    
     @implementaiton People
    
     -(void)runningOutOfMoneyUsingBlock:(int (^)(int a, int b))aBlock
     {
         NSLog(@"I have run out of my money");
         int a = 10;
         int b = 50
         int m = 0;
         if(aBlock)
         {
             m = aBlock(a,b);     //(2)
         }
         NSLog(@"aBlock的返回值为:%d",m);
    
     }
    
     @end
    

    调用该方法:

     [aPeople runningOutOfMoneyUsingBlock^(int a, int b){
         return a + b;
     }];
    

    执行结果为:

     "I have run out of money"
     "aBlock的返回值为:60"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值