1:定义一个闭包属性:也是需要初始化的时候给它初始化值,如果没有初始化值,就要把它声明成可选类型
var callBack : ((jsonData : String) -> ())?
2:请求代码演示:
import UIKit class HttpTools: NSObject { // 定义一个闭包属性:也是需要初始化的时候给它初始化值,如果没有初始化值,就要把它声明成可选类型 var callBack : ((jsonData : String) -> ())? // 闭包的类型:(参数列表) -> (返回值类型) func loadData(callBack : (jsonData : String) -> ()) { self.callBack = callBack dispatch_async(dispatch_get_global_queue(0,0)) { print("发送网络请求\(NSThread.currentThread())") dispatch_sync(dispatch_get_main_queue(),{ print("获取到数据,并且进行回调:\(NSThread.currentThread())") callBack(jsonData: "jsonData数据===================") }) } } }
3:循环引用
> 写法之一: weak var weakSelf = self;
// weakSelf可能保存一个内存地址,也可能保存一个空地址:0x0地址 weak var weakSelf = self; tools.loadData { (jsonData) in // weakSef?.view : // 如果前面的可选类型,没有值,后面所有的代码都不会执行 // 如果前面的可选类型有值,系统会自动将我们的weakself进行解包,并且使用weakSelf weakSelf?.view.backgroundColor = UIColor.redColor() } */
> 写法之二:优先推荐使用:多加了一个[weak self]:可以说是对第一种方式的简化版写法
/*解决循环引用的方式二(推荐使用这种方式) // 这样写仅仅是对方式1的一种简化写法 tools.loadData {[weak self] (jsonData) in print("拿到了json数据了:\(jsonData)") self?.view.backgroundColor = UIColor.redColor() } */
> 写法之三:比较危险,容易产生坏内存访问:就是对象销毁后原来的指针还是指向原来的对象,产生野指针 [unowned self]
//解决循环引用的方式三 tools.loadData {[unowned self] (jsonData) in print("拿到了json数据了:\(jsonData)") self.view.backgroundColor = UIColor.redColor() }
知识点补充:销毁方法
// deinit相当于oc中的dealloc方法,当对象销毁的时候会调用这个方法 deinit{ print("deinit---------"); }
4:代码演示 :
import UIKit class ViewController: UIViewController { // 创建属性的同时初始化对象 var tools : HttpTools = HttpTools() override func touchesBegan(touches: Set<UITouch>,withEvent event: UIEvent?) { print("-----"); /*解决循环引用的方式一 // weakSelf可能保存一个内存地址,也可能保存一个空地址:0x0地址 weak var weakSelf = self; tools.loadData { (jsonData) in print("拿到了json数据了:\(jsonData)") // weakSef?.view :如果前面的可选类型,没有值,后面所有的代码都不会执行 // 如果前面的可选类型有值,系统会自动将我们的weakself进行解包,并且使用weakSelf weakSelf?.view.backgroundColor = UIColor.redColor() } */ /*解决循环引用的方式二(推荐使用这种方式) // 这样写仅仅是对方式1的一种简化写法 tools.loadData {[weak self] (jsonData) in print("拿到了json数据了:\(jsonData)") self?.view.backgroundColor = UIColor.redColor() } */ //解决循环引用的方式三 tools.loadData {[unowned self] (jsonData) in print("拿到了json数据了:\(jsonData)") self.view.backgroundColor = UIColor.redColor() } } // deinit相当于oc中的dealloc方法,当对象销毁的时候会调用这个方法 deinit{ print("deinit---------"); } }
5:尾随闭包:如果闭包作为方法的最后一个参数,那么()可以省略掉
三种写法:
> 普通写法:({
})
// 普通写法 tools.loadData ({[weak self] (jsonData) in print("拿到了json数据了:\(jsonData)") self?.view.backgroundColor = UIColor.redColor() })
> 写法之一:(){
}
// 写法一 tools.loadData () {[weak self] (jsonData) in print("拿到了json数据了:\(jsonData)") self?.view.backgroundColor = UIColor.redColor() }
{
}
// 写法二:系统默认会省略掉()写法 tools.loadData {[weak self] (jsonData) in print("拿到了json数据了:\(jsonData)") self?.view.backgroundColor = UIColor.redColor() }
意见反馈邮件:1415429879@qq.com 欢迎你们的阅读和赞赏、谢谢!