关于Block初识与自己的认识

前些天学到了Block,对于Block有了一些大致的认识

Block是什么?

我认为是一些行为的封装 

 

举个例子  要将两个参数进行加减乘除   

创建4个Block实现价钱乘除四个操作即可  

用一个方法  传两个参数和一个block  返回就是block对这两个参数的操作

代码演示

 1 #import <Foundation/Foundation.h>
 2 #import "Calc.h"
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5         // typedef
 6         Calc * calc = [[Calc alloc] init];
 7 //        NSLog(@"%d",[calc calculateWithNumber1:3 andNumber2:5 withCalBlock:^int(int a, int b) {
 8 //            return a-b;
 9 //        }]);
10         
11         NSLog(@"%d",[calc calculateWithNumber1:2 andNumber2:5 withCalBlock:^int(int q, int w) {
12             return q*w;
13         }]);
14 //        NSLog(@"%d",[calc calculateWithNumber1:3 andNumber2:6 withCalcBlock:^int(int a, int b) {
15 //            return a*b;
16 //        }]);
17     }
18     return 0;
19 }
main.m
1 #import <Foundation/Foundation.h>
2 
3 typedef int (^CalcBlock) (int,int); // 定义一个block类型,类型的名称为CalcBlock
4 @interface Calc : NSObject
5 - (int)calculateWithNumber1:(int)num1 andNumber2:(int)num2 withCalBlock:(int (^)(int,int))calBlock;
6 - (int)calculateWithNumber1:(int)num1 andNumber2:(int)num2 withCalcBlock:(CalcBlock)calcBlock;
7 - (int)calculateWithNumber1:(int)num1 andNumber2:(int)num2 withSel:(SEL)sel;
8 
9 @end
Calc.h
 1 #import "Calc.h"
 2 
 3 @implementation Calc
 4 - (int)calculateWithNumber1:(int)num1 andNumber2:(int)num2 withCalBlock:(int (^)(int,int))calBlock {
 5     return calBlock(num1,num2);
 6 }
 7 
 8 - (int)calculateWithNumber1:(int)num1 andNumber2:(int)num2 withCalcBlock:(CalcBlock)calcBlock {
 9     return calcBlock(num1,num2);
10 }
11 
12 @end
Calc.m

 

 

Block语法

 返回值(^Block名称)(参数列表) = ^返回值(参数列表){};

 

使用Blcok实现数组排序   根据Block返回值的不同来实现从大到小或从小到大的排序

以下代码   在循环遍历事 可以用Block来控制数组元素交换的条件 从而达到排序效果

 
 1 #import <Foundation/Foundation.h>
 2 #import "NSArray+Extention.h"
 3 int main(int argc, const char * argv[]) {
 4     @autoreleasepool {
 5         NSArray * array = @[@"b",@"f",@"d",@"a",@"c"];
 6         NSArray * array2 = [array sortedArrayByBlock:^BOOL(id obj1, id obj2) {
 7             return [obj1 isGreaterThan:obj2];
 8         }];
 9         [array2 show];
10         
11         
12     }
13     return 0;
14 }
main.m
1 #import <Foundation/Foundation.h>
2 
3 //扩展?
4 @interface NSArray (Extention)
5 - (void)show;
6 - (NSArray *)sortedArrayByBlock:(BOOL(^)(id,id))cmp;
7 @end
NSArray+Extention.h
 1 #import "NSArray+Extention.h"
 2 
 3 @implementation NSArray (Extention)
 4 - (void)show {
 5     for (id obj in self) {
 6         NSLog(@"%@",obj);
 7     }
 8 }
 9 
10 - (NSArray *)sortedArrayByBlock:(BOOL (^)(id, id))cmp {
11     NSMutableArray * muarray = [NSMutableArray arrayWithArray:self];
12     for (int i = 0; i<self.count - 1; i++) {
13         for (int j = 0; j< self.count-1-i; j++) {
14             //引入Block方法
15             if (cmp(muarray[j],muarray[j+1])) {
16                 [muarray exchangeObjectAtIndex:j withObjectAtIndex:j+1];
17             }
18         }
19     }
20     return [muarray copy];
21 }
22 
23 
24 @end
NSArray+Extention.m

 

 

然后是老师的一个例子  用Block实现Boss让Worker买电脑

虽然我能看懂代码  但实在不理解 这样做的意义。。  Block的意义在于把Boss的电脑个数增加 

附上代码 

 1 #import <Foundation/Foundation.h>
 2 #import "Boss.h"
 3 #import "Worker.h"
 4 
 5 int main(int argc, const char * argv[]) {
 6     @autoreleasepool {
 7         Worker * worker = [[Worker alloc] init];
 8         Boss * boss = [[Boss alloc] init];
 9         [boss showMacbooks];
10         [worker buyMacbookWithNum:12 withSendFinishedBlock:^(int num) {
11             boss.numOfMacbooks += num;
12         }];
13         [boss showMacbooks];
14     }
15     return 0;
16 }
main.m
1 #import <Foundation/Foundation.h>
2 #import "Worker.h"
3 @interface Boss : NSObject
4 @property (nonatomic,assign) int numOfMacbooks;
5 - (void)showMacbooks;
6 @end
Boss.h
1 #import "Boss.h"
2 
3 @implementation Boss
4 - (void)showMacbooks {
5     NSLog(@"老板现在有Macbook%d台",_numOfMacbooks);
6 }
7 
8 @end
Boss.m
1 #import <Foundation/Foundation.h>
2 
3 @interface Worker : NSObject
4 - (void)buyMacbookWithNum:(int)num withSendFinishedBlock:(void(^)(int))sentBlock;
5 @end
Worker.h
1 #import "Worker.h"
2 
3 @implementation Worker
4 - (void)buyMacbookWithNum:(int)num withSendFinishedBlock:(void(^)(int))sentBlock{
5     NSLog(@"买了%d台Macbook",num);
6     NSLog(@"给老板%d台",num);
7     sentBlock(num);
8 }
9 @end
Worker.m

 

转载于:https://www.cnblogs.com/gwkiOS/p/4967579.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值