前言
这篇随记就是向大家简单介绍下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需要单独调用)
- 在你需要用到block中得参数.或者需要触发某个事件的时候,实现block,在block的实现方法中完成你想要的功能
这就是我对block的简单介绍,希望对有需要的人有些帮助.
这也是自己的理解,一定会有不透彻或者问题.希望大神可以提出宝贵意见.谢谢
网友评论