Block 学习(8.11)

来源:互联网 发布:淘宝外卖显示系统繁忙 编辑:程序博客网 时间:2024/06/11 00:15

Block:定义一段代码片段,在需要的时候调用。很多解释都是这样的,是不是一头雾水,不明白所云。反正我是好长一段时间都消化不了这个解释。最后从它的使用场景入手,才慢慢理解了这种语法的精髓,所以笔记一下,以供以后复习用。

有这样的场景在ios开发当中经常会遇到:

场景一:初始化一个页面可能一些数据是从服务器端拿回来才能赋给控件进行展示,这时候这些耗时的网络请求不可能一直等着它拿到数据再加载控件吧,这样用户体验也太差了,比较好的处理方式是先加载控件,把赋值代码放在block中,等拿到数据了再赋值。

直接上代码吧:

-(void)viewDidLoad {

    [superviewDidLoad];

    UILabel * lable = [[UILabelalloc]init];

    [selfloaData:^(NSString * lableText) {

        NSLog(@"%@",lableText);

        lable.text = lableText;

    }];

}

//实现block方法

-(void)loaData:(void(^)(NSString * a))block{

    //耗时操作的代(网路请求)

    block(@"我是耗时操作得到的数据");

}

场景二:页面间传值,在点击b页面的时候把值传到a页面。窍门哪个页面要传值在哪个页面定义block

B.h:

#import <UIKit/UIKit.h>

typedef void(^block)(NSString *);

@interface BViewController : UIViewController

@property (nonatomic,copy) block MyBlock;

@end


B.m:

#import "BViewController.h"

#import "AviewController.h"


@interfaceBViewController ()


@end


@implementation BViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    self.view.backgroundColor = [UIColorredColor];

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    self.MyBlock(@"我要传值给A");

}


A.m:

#import "AviewController.h"

#import "BViewController.h"


@interfaceAviewController ()

@end


@implementation AviewController


-(void)viewDidLoad {

    [superviewDidLoad];

    

}


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    BViewController * bview = [[BViewControlleralloc]init];

    bview.MyBlock = ^(NSString * str) {

        NSLog(@"%@", str);

    };

    [selfpresentViewController:bviewanimated:YEScompletion:nil];

}


block其实并不可怕,掌握其原理,灵活应用就行。