Block:定义一段代码片段,在需要的时候调用。很多解释都是这样的,是不是一头雾水,不明白所云。反正我是好长一段时间都消化不了这个解释。最后从它的使用场景入手,才慢慢理解了这种语法的精髓,所以笔记一下,以供以后复习用。
有这样的场景在ios开发当中经常会遇到:
场景一:初始化一个页面可能一些数据是从服务器端拿回来才能赋给控件进行展示,这时候这些耗时的网络请求不可能一直等着它拿到数据再加载控件吧,这样用户体验也太差了,比较好的处理方式是先加载控件,把赋值代码放在block中,等拿到数据了再赋值。
直接上代码吧:
-(void)viewDidLoad {
[super viewDidLoad];
UILabel * lable = [[UILabel alloc]init];
[self loaData:^(NSString * lableText) {
NSLog(@"%@",lableText);
lable.text = lableText;
}];
}
//实现block方法
-(void)loaData:(void(^)(NSString * a))block{
//耗时操作的代(网路请求)
block(@"我是耗时操作得到的数据");
}
场景二:页面间传值,在点击b页面的时候把值传到a页面。窍门哪个页面要传值在哪个页面定义blockB.h:
#import <UIKit/UIKit.h>
typedef void(^block)(NSString *);
@interface BViewController : UIViewController
@property (nonatomic, copy) block MyBlock;
@end
#import "BViewController.h"
#import "AviewController.h"
@interface BViewController ()
@end
@implementation BViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor redColor];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
self.MyBlock(@"我要传值给A");
}
#import "AviewController.h"
#import "BViewController.h"
@interface AviewController ()
@end
@implementation AviewController
-(void)viewDidLoad {
[super viewDidLoad];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
BViewController * bview = [[BViewController alloc]init];
bview.MyBlock = ^(NSString * str) {
NSLog(@"%@", str);
};
[self presentViewController:bview animated:YES completion:nil];
}