(java转行oc)什么是block,用java来解释oc中的block

http://blog.csdn.net/roverk8y/article/details/18303949


Blcok

1.Java代码说明blcok

就是Java中匿名内部类,而匿名内部类的好处是代码更清晰

例如

button btn = new Button().setListener(newListener(){

//  这里写上监听的代码,这样就可以很直观的观察到这个btn要干啥了

//  例如这里写个发送邮件的代码,这样人们就知道你这按钮是点击后是发    //送邮件的功能

});

 

而如果不写这种方法你就需要这么写

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. class activity implements OnClickListener{  
  2. onCreate(){  
  3. button btn = new Button();  
  4. btn.setListen(this);  
  5. }  
  6. // 这里有很多其他代码如让你感觉很乱,例如其他方法  
  7.    
  8.    
  9. …  
  10.    
  11. onClick() {  
  12.  //送邮件的功能  
  13. }  
  14. }  
  15.    


2.oc代码说明blcok

 

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. -(IBAction)buttonTapped:(id) sender {  
  2.    
  3.  UIAlertVeiw *alert = [[UIAlert alloc]initWithTitle:@”send email”  
  4.  Message :@“ send it ?”  
  5.  Delegate:self  
  6.  cancelbutonTitle:@”cancel”  
  7.  otherButtonTitle:@”send”,nil]  
  8.    
  9. [alert show]  
  10. [alert release]  
  11. }  
  12. - (void) alertView:(UIAlertView*) alertViewdidiDismissWithButtonIndex:(NSInteger) buttonIndex {  
  13.     if(buttonIndex != [alertView cancelButtonIndex]) {  
  14.        [self sendTheMail];  
  15.     }  
  16. }  
  17. - (void) sendTheMail{  
  18.     //发送邮件代码  
  19. }  
  20.    


 

使用block 的匿名内部方法写

 

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.  [UIAlertView showAlertViewWithTitle:@"send email"  
  2.                       message:@"send it?"  
  3.                       cancelButtonTIle:@"cancel"  
  4.                      otherButtonTitles:[NSArray arrayWithObjects:@"send",nil]  
  5.                       onCompletion:^{  
  6.                           //发送邮件代码  
  7. //多说一句 ^{} 这个就是block 的实现,由于没有参数输     入也就省了,要不就是这样 ^(int i, int j){}  
  8.                       }  
  9.                       onCancel:^{  
  10.                           //退出代码  
  11.                       }  
  12.       
  13.      ]  

这样就清楚多了

不需要实现委托(实现接口) delegate:selft

不需要分配和释放对象       [alert release]

不需要明确的显示警告对话框 [alertshow]

 

3 block作用域

和java不同在java匿名内部类里面是不可以访问它外面的代码的,除非你把代码定义为 final

而block 不需要定义final,直接用就ok 的

 

main(){

 intc = 25;

  ^(int i, int j ) {

NsLog(@”%i”,c);// 这里直接能打印c变量的值,但不能改变也就是c = 19这里不行

 

}

}

如果非要想改也可以用__block 关键字

main(){

 __Block int c = 25;

  ^(int i, int j ) {

          c = 19;

NsLog(@”%i”,c);// 这里就可以改变c = 19的值了

 

}

}

4.block和函数区别

函数不能定义在其他函数体内,block却可以,他就是一段代码块,而不是函数,但是跟函数是很像的

 

 

5.GCD与block

说白了就是在iOS中有一些下载是需要放在后台来做的,这时候就需要异步,而GCD就是用于做异步的

 

一般移动平台上系统都会有一个专门的检查机制,看程序有没有很长时间被阻塞住,没有回来检查主消息队列。发现这种情况一般都是把程序作为“无响应”干掉。iOS一般情况下是10秒为上限。10秒内程序没有回到主消息循环就被干掉。在前台后台切换时更严格,大概是5秒左右

 

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 用户点击了按纽,触发计算操作  
  2.     - (void) didTapCalcButton {  
  3.         // 显示“请等待”提示  
  4.         [self showWaitingView];  
  5.          
  6.         // 以下两行将任务排程到一个后台线程执行。dispatch_get_global_queue会取得一个系统分配的后台任务队列。  
  7.         dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  8.         dispatch_async(queue, ^{  
  9.              
  10.             // 计算PI值到100万位。和示例1的calcPI:完全一样,唯一区别是现在它在后台线程上执行了。  
  11.             NSString *result = [self calcPI:1000000];  
  12.              
  13.             // 计算完成后,因为有UI操作,所以需要切换回主线程。一般原则:  
  14.             // 1. UI操作必须在主线程上完成。2. 耗时的同步网络、同步IO、运算等操作不要在主线程上跑,以避免阻塞  
  15.             // dispatch_get_main_queue()会返回关联到主线程的那个任务队列。  
  16.             dispatch_async(dispatch_get_main_queue(), ^{  
  17.                  
  18.                 // 关闭“请等待”提示  
  19.                 [self hideWaitingView];  
  20.                  
  21.                 // 显示结果  
  22.                 [self displayResult:result];      
  23.             });  
  24.         });  
  25.     }  
  26.    


 

6.GCD与NSOperationQueue

与GCD一样的还有个NsperationQueue的队列机制(GCD 也是队列),他们的优势在于多核心处理,可以确保一个独立单元在多个处理器上

他们的区别是

1.GCD只支持FIFO(先进先出)队列,而NSOperationQueue可以被重新排序(按优先级排序)

 

2.如果某个操作需要另一个操作生成的数据,可以让这个操作依赖另一个操作,NSOperationQueue会自动按照顺序正确的执行,而GCD没有这个功能

 

3. NSOperationQueue兼容KVO,这意味着你可以观察任务的状态。

 

4.GCD的执行速度是比NSOperationQueue快的,如果你需要性能的话推荐使用GCD这个,而且通常情况下,任务之间是不会相互依赖的,高德纳说过“过早的优化是万恶之源”只有在Instruments显示有必要性能提升的时候才用GCD

 

关于过早的优化,可以举出fermax gu的installer 页面问题,由于打开页面需要数据,而没有做分页,导致1w条数据在打开页面的时候直接出现加载1w条数据,所以页面打开很慢,而由于是pc 加载1w条数据还是比较快,大概4秒就能开发,所以只是短暂的卡,并没有发现大问题,老大说要优化页面的时候,我说出要找到真正的问题点去优化,而不是到处啥重构,到处瞎优化

 

7.block优势 

如果用于委托的话

1.不需要分配或者释放对象

2.不需要实现委托

3.内部代码块可以访问外部变量

4.减少代码

 

例如在ios3中实现动画你需要设置一堆参数,大概需要5-6行

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.    [UIView beginAnimations:@"" context:&myContext];  
  2.     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];  
  3.     [UIView setAnimationDuration:1.0f];  
  4.     [UIView setAnimationDelay:1.0f];  
  5.     [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)];  
  6.     self.imageView.alpha0.0;  
  7. [UIView commitAnimations];  


 

而有了block后可以这么写,代码变简单了不是吗?

 

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. UIView animateWithDuration:1.0 delay:1.0options:UIViewAnimationCurveEaseInOut  
  2.     animations:^{  
  3.          self.imageView.alpha0.0;  
  4.     }  
  5.     completion:^(BOOL finished) {  
  6.     [self.imageViewremoveFromSuperView];  
  7. }  


 

 

又例如在遍历代码的字典的时候也可以使用block,不用跟objetForkey什么的打交道了

 

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. [dictionary emumerateKeysAndObjectsUsingBlock:^(id key, id val, boolbool *stop){  
  2.         NSLog(@"@",@"%@", key,val);  
  3.     }];  

 

 

8.block一般在什么地方能用

对于一个方法,检查当前方法是否存在上下文参数,如果有,那就很有可能会有基于block的等价方法

寻找委托,一般通过委托方法来通知结果的类你可能会找到一个completionHandler

大部分遍历、排序、过滤方法都有基于block的等价方法,array dicitonary string

sttibutedString FileManager都有的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值