zoukankan      html  css  js  c++  java
  • ios高效开发--blocks相关

    1、替换delegate
     
        如果我们有2个viewController,a和b,当我们从a界面push到b后,在b上面触发了一些事件,这些时间又会影响到a界面上的内容。
                  
    上面是2个界面,当我们点击b界面的按钮3的时候,希望a界面上文字也相应的改变了
       
     
    一般情况下我们会用delegate来实现。
    代理很强大,不过代理它是程序的事件逻辑也变的复杂了。
     
    来看下用block怎么处理。
     一个block语句的定义类似于C的函数,有返回值,有0到多个参数,接下来属性声明,跟一般的属性声明差不多: 
    1 typedef void (^CallBack)(int index);
    2 
    3 @property(nonatomic, copy)CallBack callBack;
     
    然后在b里面触发按钮事件的时候调用block,调用前最好先检查下是否为nil
      
     1 - (IBAction)click2:(id)sender
     2 {
     3     if(self.callBack)
     4         self.callBack(2);
     5 }
     6 
     7 
     8 - (IBAction)click3:(id)sender
     9 {
    10     if(self.callBack)
    11         self.callBack(3);
    12 }
    现在完成了调用,具体的实现在哪呢,我们回到a当中,在a中执行跳转界面的地方,加上相关的实现。
     
    1     SecondViewController *secondController = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
    2     
    3     secondController.callBack = ^(int index)
    4     {
    5         self.clickBtnLabel.text = [NSString stringWithFormat:@"click %d", index];
    6     };
    7     
    8     [self.navigationController pushViewController:secondController animated:YES];
    在是用block的时候,要注意所有权的问题,要小心产生循环,那样会导致资源无法释放。
    例如在block中使用了一个指针,恰巧这个指针又是block的拥有者,那么会产生一个循环引用,他们都是强引用,无法释放。为了避免产生类似的问题,就需要用__weak标记block的拥有者。delegate和block在上面时候是用,要看具体情况,如果一个类的delegate里有很多方法,那还是放在delegate里实现吧。
     
    2、系统定义的block
    ios当中还有大量系统已经定义好的block,使用这些block实现特定的一些功能,能是整体代码更加简洁和高效。
    例如遍历字典的时候,ios就提供了:
    - (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block;

    简单举个例子,我们要在字典中根据key来查找某个value,然后把value记录下来。

     1     NSArray *keyArray = @[@"aa", @"ddd", @"cc", @"bb", @"ww", @"111"];
     2     NSArray *valueArray = @[@"apple", @"ios", @"mac", @"xcode", @"view", @"array"];
     3     NSDictionary *enumDict = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
     4     __block NSString *valueString = nil;
     5     [enumDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
     6         if([key isEqualToString:@"bb"])
     7         {
     8             valueString = obj;
     9             *stop = YES;
    10         }
    11     }];

    整个过程变的简单了。

    还有在实现UIView动画的时候,block能让我们更加简单高效的实现很多特效。

    1     [UIView animateWithDuration:0.5 animations:^{
    2         animateView.alpha = 0.0;
    3     } completion:^(BOOL finished) {
    4         animateView.alpha = 1.0;
    5     }];

    这段代码实现了view透明度从1.0变到完全透明,用时0.5秒,当动画结束后重新显示view。

  • 相关阅读:
    一道Twitter面试题
    聊下并发和Tomcat线程数(错误更正)
    Entity Framework系列教程汇总
    SqlServer基础汇总
    .Net Core中间件和过滤器实现错误日志记录
    快速掌握mongoDB(六)——读写分离的副本集实现和Sharing介绍
    快速掌握mongoDB(五)——通过mongofiles和C#驱动操作GridFS
    快速掌握mongoDB(四)—— C#驱动MongoDB用法演示
    快速掌握mongoDB(三)——mongoDB的索引详解
    快速掌握mongoDB(二)——聚合管道和MapReduce
  • 原文地址:https://www.cnblogs.com/wqxlcdymqc/p/3225184.html
Copyright © 2011-2022 走看看