Block的介绍及使用

作者: 王道ob | 来源:发表于2016-07-31 11:37 被阅读91次

    前言

    这篇随记就是向大家简单介绍下block以及一些简单地用法.我相信对于一些初学者会有一些帮助的.

    什么是block

    Block(块)在其他编程语言中也有相似的概念, 叫闭包
    Block和函数指针非常相似(技巧:将(*p) 换成(^block))
    Block本质是匿名函数

    声明一个block变量.

    block跟函数类型是一样的
    分为:
    1* 无参数, 无返回值
    2* 无参数, 有返回值
    3* 有参数, 无返回值
    4* 有参数, 有返回值
    例:
    变量类型: int (^)(int, int)
    变量名: handler
    int (^handler)(int, int) = NULL;

    block的使用

    用法跟函数也是一样的
    block的实现和调用.在适当地时机调用block,然后执行实现中的方法(代码).完成一系列的功能
    下面我就为大家简单介绍一些block的使用:

    界面之间的传值

    第一种:将block设置为属性
    
     重命名void(^)(NSString *)类型  命名为Block  这样方便书写.
    typedef void(^Block)(NSString *);
    @interface TwoOfViewController : UIViewController
    声明一个Block属性
    @property (nonatomic, copy) void (^handleString)(NSString *);
    //  下面这个就是用重命名的block定义的
    @property (nonatomic, copy) Block handleStr;
    @end
    
    然后在 (button) 适当时机调用block
    - (IBAction)handleBlock:(id)sender {
        // 调用Block
        self.handleString(self.textfiled.text);  
      参数  位子就是你要传得值
    }
    下面是在需要传入的界面 实现block
    TwoOfViewController *second = [segue destinationViewController];
       //Block实现部分
        //Block实现体中, 对对象进行强引用, 避免循环引用,  修改为弱引用.
        //ARC下. __weak 修饰词
        //MRC下. __block 修饰词
        __weak typeof(self) weakself = self;
    实现部分
        second.handleString = ^(NSString * str)
        {
      运用带入的参数, 实现一些功能
            weakself.label.text = str;
        };
    
    
    第二种: 将block作为方法的参数 
    跟属性传值是一样的,只是将block作为方法的参数.
    然后在第二界面调用方法,实现block.完成一些功能.
    但是要记住 :   调用方法并不是调用block.. 可以在方法中完成block的调用...
    完成传值...
    
    

    Block实现网络请求回调

    #import "NetWord.h"
    @implementation NetWord
    下面是封装的一个解析网络数据的类方法..方法中有block参数
    + (void)networkHandlerGetWithURL:(NSString *)urlString completionHandler:(void (^)(id result, NSURLResponse *response, NSError *error))block
    {
        //url中只支持ASCII吗, 如果出现中文需要进行转码
        //url中的中文一般出现在查询部分, 所以将查询部分进行转码.
       NSString *newStr = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
        //Core API
        NSURLSession *session = [NSURLSession sharedSession];
        //URL
        NSURL *url = [NSURL URLWithString:newStr];
        
        //session添加任务
       NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                  //数据解析
           if (data) {         
               id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];       
           //进入主线程, 将result等回调出去      
           dispatch_async(dispatch_get_main_queue(), ^{         
               // 通过block回调
               block(result, response, error);           
           });       
           }              
       }];
           [task resume];
    }
    
    下面是调用方法时候block的实现
    - (void)handleData
    {
        [NetWord networkHandlerGetWithURL:@"http://api.m.mtime.cn/News/NewsList.api?pageIndex=1" completionHandler:^(id result, NSURLResponse *response, NSError *error) {
      // 这里的实现只是简单打印下.还可以使用block参数做一些你想要得功能        
            NSLog(@"%@",result);
        }];    
    }
    

    Block实现自定义View点击事件回调

    @interface CustomeView ()
    @property (strong, nonatomic) IBOutlet UIView *view;
    
    //声明Block属性, 参数是button
    @property (nonatomic, copy) void (^handleEdit)(UIButton *);
    @property (nonatomic, copy) void (^handleDele)(UIButton *);
    
    @end
    
    @implementation CustomeView
    
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
        self = [super initWithCoder:aDecoder];
        if (self) {
            [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];        
            self.view.frame = self.bounds;
            [self addSubview:self.view];
        }
        return self;
    }
    #pragma mark - 点击事件.
    下面俩个方法是button的点击事件. 在点击button的时候调用block,
    - (IBAction)handleEdit:(id)sender {    
        // 调用Block
        self.handleEdit((UIButton *)sender);    
    }
    - (IBAction)handleDelete:(id)sender {    
        self.handleDele((UIButton *)sender);
    }
    
    下面这个方法是声明出去的,目的是给属性的俩个block赋值
    - (void)clickEditBtn:(void (^)(UIButton *editBtn))handleEdit delebtn:(void (^)(UIButton *deleBtn))handlerDele
    {
        //Block属性赋值
        self.handleEdit = handleEdit;
        self.handleDele = handlerDele;
    }
    
    下面是调用俩个block的赋值的方法
    - (void)viewDidLoad {
        [super viewDidLoad];
       当调用这个方法的时候. 先走了方法中的给属性赋值代码,这个时候属性的指针已经指向调用方法时候的block.
    当点击按钮button的时候.调用block.然后走下面方法中block 的实现部分
        [self.customview  clickEditBtn:^(UIButton *editBtn) {
            NSLog(@"点击了编辑");
            [editBtn setTitle:@"wangdali" forState:UIControlStateNormal];
            self.view.backgroundColor = [UIColor redColor];
            UILabel *lable = [[UILabel alloc] initWithFrame:CGRectMake(50, 400, 100, 50)];
            [self.view addSubview:lable];
            lable.text = editBtn.titleLabel.text;
        } delebtn:^(UIButton *deleBtn)        
            NSLog(@"点击了删除");
        }];    
    }
    block实现自定义View点击事件回调有什么作用那:
    因为自定义的view中的button 在正常情况下,只能做一些局限于自定义View界面的事情...
    可是...当用block时候..这个触发消息会将button的属性或者更多地属性带到其他界面.在其他界面完成关于其他界面的操作.
    
    

    总结

    block的基本用法其实并不是很难.只要理解了block是什么,实现原理就可以运用了
    记住俩个步骤:
    1.需要找到适当地时机调用block,传入你想在实现中用到的参数.(block只有调用了才走实现部分,,,(注意:当block作为方法参数时候,调用方法,并不是调用了block..block需要单独调用)

    1. 在你需要用到block中得参数.或者需要触发某个事件的时候,实现block,在block的实现方法中完成你想要的功能

    这就是我对block的简单介绍,希望对有需要的人有些帮助.
    这也是自己的理解,一定会有不透彻或者问题.希望大神可以提出宝贵意见.谢谢

    相关文章

      网友评论

      本文标题:Block的介绍及使用

      本文链接:https://www.haomeiwen.com/subject/umjtsttx.html