Swift闭包理解

2019-03-14  本文已影响0人  iOS_July
//闭包
    func closureDemo() -> () {
        
        //最简单的闭包
        let b1 = {
            print("hello world")
        }
        //执行
        b1()
        
        
        
        //带参数、无返回值的闭包
        /**
         * 闭包中,参数、返回值、实现代码,都是写在 {} 中
         * 需要使用一个关键字 in 分隔定义和实现的代码
         * { 行参列表 -> 返回值类型 in // 实现代码 }
         */
        let b2 = { (x : Int) -> () in
            print(x)
        }
        //执行
        b2(10)
        
        
        //带参数、带返回值的闭包
        let b3 = { (x : Int) -> Int in
            return x+10
        }
        print(b3(2))
        
    }
//MARK: - GCD 模拟
    func loadData(completion : @escaping (_ result : [String]) -> ()) -> () {
        
        //将任务添加到队列,指定执行任务的函数
        //队列调度任务(block/闭包),以 同步/异步 的方式执行
        
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
            
            //休眠 模拟网络
            Thread.sleep(forTimeInterval: 1.0)
            let json = ["1","2","3"]
            
            
            //主队列 回掉
            DispatchQueue.main.async(execute: {
                print("主线程更新UI \(Thread.current)")
                
                // 回调 -> 执行 闭包(通过参数传递)
                //传递异步获取的结果
                completion(json)
            })
        }
    }
loadData { (result) in
            print("获取的数据 \(result)")
        }
//MARK: - 循环引用
    func loadData2(completion : @escaping () -> ()) -> () {
        
        DispatchQueue.global().async {
            print("耗时操作 \(Thread.current)")
            
            DispatchQueue.main.async(execute: {
                
                //回调、执行闭包
                completion()
                
            })
        }
    }
 //MARK: - 解除循环引用
        //1.OC 的方法
        //细节:使用的是 var,因为weak 可能在运行的时候被修改 -> 指向的对象一旦被释放,就会被自动设置为nil
        weak var weakSelf = self
        loadData2 {
            
            //细节2:解包方式有两种
            // ? 可选解包 - 如果self已经被释放了,不会向对象发送 getter 的消息,安全合理
            // ! 强行解包 - 如果self已经被释放了,强行解包会导致崩溃
            print(weakSelf?.view)
        }

//2.Swift 的推荐方法
        //[weak self] 表示 {} 中的所有 self 都是弱引用,需要注意解包
        loadData2 { [weak self] in
            print(self?.view)
        }
        
        //3.Swift 的另一个方法
        //[unowned self] 表示 {} 中的所有 self 都是assign的,不会被强引用,但是如果对象释放,指针地址不会变化
        //如果对象被释放,继续调用的话,就会出现野指针的问题
        loadData2 { [unowned self] in
            print(self.view)
        }
other
上一篇 下一篇

猜你喜欢

热点阅读