iOS 对于block的理解
来源:互联网 发布:手机摇奖软件 苹果 编辑:程序博客网 时间:2024/04/30 15:01
block是对象,它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似,但是有区别:block是inline的,并且它对局部变量是只读的。
Block的定义:
int (^myBlock) (int a,int b) = ^(int a,int b){
return a+b;
};
定义了一个名为myBlock的blocks对象,它带有两个int参数,返回int。等式右边就是blocks的具体实现,是不是有点像方法的定义?
Block可以访问局部变量,但是不能修改。比如下面的代码就会报编译错
int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
如果要修改就要加关键字:__block (注意,是两个下划线"_")
__block int num = 0;
//使用block
int (^myBlock) (int a,int b) = ^(int a,int b){
num = a+b;
return num;
};
作为函数的参数,blocks某种意义上替代了回调函数或者delegate。当函数调用了,假设某个事件触发,这时block里的内容就会运行。这样有利于代码的整合和阅读,你不需要到处去实现委托方法了。
--------------------------------
以上是转来的一些block基本知识,下面说一下自己的学习体会。
初次接触objective-c, 看到block时一下子被它的语法格式吓到了,感觉很别扭。起初只是把block当作代码段,并没有看到它的威力。由于项目中涉及一些网络请求操作,需要异步处理,要求使用block,这才真正去了解它。下面说一下block是怎样做异步处理的。
假设A有一个任务,是去仓库取一张A4纸放到会议室,然后在纸上写一份策划书。取纸又要经过仓库管理员,于是A通知仓库管理员来张纸过来。由于管理员是个老头动作很慢,另外A还有其他工作,如果一直等待管理员就太浪费时间了,合理的做法是让仓库管理员进行取纸这项工作,A在通知管理员后就继续自己的工作。A不知道仓库管理员什么时候能完成取纸,也就不知道什么时候可以在纸上写策划书。这时block机制就派上用场了,使用这种机制,可以让A在通知仓库管理员取纸的同时,告诉仓库管理员将纸放到编号XX会议室,并安排好将要在纸上写的策划内容,当管理员把纸拿来后,可能过一会就会有个助理将策划内容写到纸上。
我们将这个故事对应到代码上:
#pragma mark - 第三方登录- (void)btnLoginWeiboClicked:(id)sender { [_waitCircle startAnimating]; [[HSLoginClass createInstance] loginWithPlatformType:ShareTypeSinaWeibo withBlock:^(BOOL success, id message) { if (success) { //跳出登录页面 [self dismissViewControllerAnimated:YES completion:^{}]; [_waitCircle stopAnimating]; NSLog(@"新浪微博 %@", message); } else { } }]; //test statistics dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSDate* date = [NSDate date]; NSTimeInterval nowTime = [date timeIntervalSince1970]; NSString* netStatus = (NSString*)[[NSUserDefaults standardUserDefaults] objectForKey:NETSTATUS]; [[HSStatisticsModule statisticsModule] makeSession:nowTime :OPER_IN :@"noid"]; [[HSStatisticsModule statisticsModule] upLoadData:netStatus :[NSString stringWithFormat:@"%f", nowTime]]; });}
请看这段代码,整个方法是A要做的工作,startAnimating/loginWithPlatformType/dispatch_async分别是A要做的三个任务,由于loginWithPlatformType需要一段时间才能完成,并且loginWithPlatformType完成后要根据结果做相应处理,所以我们对loginWithPlatformType进行异步处理。block代码段是loginWithPlatformType得到结果后要做的操作H,这里的block写法就表示,我们先将操作H安排好,然后继续其他工作,当loginWithPlatformType执行ok后自会有人(可能是那个助理)去执行操作H。
- iOS 对于block的理解
- iOS 对于block的理解
- iOS block的理解
- iOS笔记-(Block的理解)
- 对于block的理解及用法的注意
- 个人对于OC中delegate、block的简单理解
- 对于BLock的学习
- IOS学习 对于协议的理解
- iOS—对于BOOl类型的理解
- 对iOS中Block的理解
- iOS Block 的理解与学习
- 关于iOS block传值的理解
- iOS 代理和block的理解
- ios开发中对block 的理解
- ios block之理解
- ios开发-block理解
- iOS block 个人理解
- IOS block 练习题 强化理解block
- 循环单链表-两个循环单链表连接
- 把整形转换成2进制打印出来
- zend studio 10破解/汉化
- CMake tips
- 学习之角点检测Harris
- iOS 对于block的理解
- 计算机视觉与模式识别代码合集第二版one
- 第十二周项目五 判断当年第几天(数组法)
- adt 添加库文件夹
- Linux tar command
- Thread Dump线程死锁检测工具(JStack)的使用详解
- 论数据结构中的内排序和外排序
- HTML5实例——图像及动画
- 2015年