美文网首页
swift语法--12-1闭包基本概念

swift语法--12-1闭包基本概念

作者: 20b347b28fc9 | 来源:发表于2016-03-12 01:23 被阅读60次

    swift语法--12-1闭包基本概念


    block和闭包区别
    • OC:

      • block类似于匿名函数, 用于封装代码块, 在特殊的时候执行
      • 执行一些耗时操作,用于回调
      • 类型: 返回值类型(^block名称)(形参列表)
      • 值:
      ^(形参列表){
         需要执行的代码
      }
      
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        [self loadData:^{
            //3.主线程刷新UI
            NSLog(@"更能UI");
        }];
        
    }
    
    - (void)loadData:(void(^)())finished
    {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            
            //1.子线程加载数据
            NSLog(@"%@", [NSThread currentThread]);
            NSLog(@"加载数据");
            dispatch_async(dispatch_get_main_queue(), ^{
                
                //2.主线程回调
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    NSLog(@"%@", [NSThread currentThread]);
                    finished();
                });
            });
        });
    }
    
    • Swift:

      • 闭包是用于定义函数(Swift中函数就是闭包, 闭包就是一个特殊的函数)
      • 执行一些耗时操作,用于回调
      • 类型: (形参列表)->返回值类型
      • 值:
      {
          (形参列表)->返回值类型
           in
           需要执行的代码
      }
      
       override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            
            loadData { () -> () in
                
                //3.在主线程更新UI
                print("更新UI")
            }
        }
        
        func loadData(finished: ()->())
        {
            dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
                
                //1.子线程下载数据
                print(NSThread.currentThread())
                print("加载数据")
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    
                    //2.加载完数据,主线程回调
                    print(NSThread.currentThread())
                    finished()
                    
                })
            }
        }
    

    闭包的几种格式

    1. 完整写法
    loadData ({ () -> () in
        print("更新UI")
    })
    //in是用于区分代码和描述
    
    2. 如果闭包没有形参, 那么in和in之前的代码都可以省略
    loadData ({
        print("更新UI")
    })
    
    3. 如果闭包是函数的最后一个参数, 那么闭包可以写在函数()的后面
    loadData (){
        print("更新UI")
    }
    
    4. 如果函数只有一个闭包参数, 那么函数的()可以省略
    loadData {
        print("更新UI")
    }
    

    相关文章

      网友评论

          本文标题:swift语法--12-1闭包基本概念

          本文链接:https://www.haomeiwen.com/subject/imjxlttx.html