//闭包
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
网友评论