ios block 初探

block 语法很怪异,以前看到总是避而远之,这次专门研究一下block的一些东西,不过也是浅层的理解,望大家指正。

Block简介

Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候取出来调用。使用场景:

1.在处理异步问题的时候使用,例如HTTP请求,有点像javascript的回调,在得到回复的时候更新主线程,而不会占用主线程,比Delegate逻辑好看的多。

2.要返回多个值得又懒得穿件一个类的时候。

用法简单举例:

-(void)func1{
    /**
     *  void :就是无返回值
     *  emptyBlock:就是该block的名字
     *  ():这里相当于放参数。由于这里是无参数,所以就什么都不写
     */
    void (^emptyBlock)() = ^(){
        NSLog(@"无参数,无返回值的Block");
    };
    emptyBlock();
}
/**
     *  有参数有返回值
     *
     *  @param NSString 字符串1
     *  @param NSString 字符串2
     *
     *  @return 返回拼接好的字符串3
     */    
    NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){
        return [NSString stringWithFormat:@"%@%@",str1,str2];
    };
    //调用logBlock,输出的是 我是Block
    NSLog(@"%@", logBlock(@"我是",@"Block"));
Block结合typedef使用

自己定义一个Block类型,用定义的类型去创建Block,更加简单便捷。
这里举例一个Block回调修改上一个界面的背景颜色。
ViewController1 控制器1,ViewController2 控制器2
控制器1跳转到控制器2,然后在控制器2触发事件回调修改控制器1的背景颜色为红色。

ViewController2的实现

#import <UIKit/UIKit.h>
@interface ViewController2 : UIViewController
/**
 *  定义了一个changeColor的Block。这个changeColor必须带一个参数,这个参数的类型必须为id类型的
 *  无返回值
 *  @param id
 */
typedef void(^changeColor)(id);
/**
 *  用上面定义的changeColor声明一个Block,声明的这个Block必须遵守声明的要求。
 */
@property (nonatomic, copy) changeColor backgroundColor;
@end
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //声明一个颜色
    UIColor *color = [UIColor redColor];
    //用刚刚声明的那个Block去回调修改上一界面的背景色
    self.backgroundColor(color);
}

ViewController1的实现

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    ViewController2 *vc =[[ViewController2 alloc]init];
    // 回调修改颜色
    vc.backgroundColor = ^(UIColor *color){
        self.view.backgroundColor = color;
    };
    [self.navigationController pushViewController:vc animated:YES];
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值