王尘宇王尘宇

研究百度干SEO做推广变成一个被互联网搞的人

Swift5 函数与闭包

  • 闭包被引用,需要逃逸。

循环引用

方法一:[weak self] (推荐)
self 是可选项,如果 self 已经被释放,则为 nil

// 类似 OC 中:__weak typeof(self) weakSelf;
// 如果 self 已经被释放,则为 nil
loadData { [weak self] in
    print("\(self?.view)")
}

方法二: [unowned self] (不推荐)
self 不是可选项,如果 self 已经被释放,则出现野指针访

// 类似 OC 中:__unsafe_unretained typeof(self) weakSelf; 
// 如果 self 已经被释放,则出现野指针访问
loadData { [unowned self] in
    print("\(self.view)")
}

方法三:与 OC 类似

weak var weakSelf = self
loadData() {
    print("\(weakSelf?.view)")
}

网络请求试写

func request(urlStr: String, compeletd:@escaping (Bool, Any) -> Void) {
    guard let url = URL(string: urlStr) else {
        return
    }
    DispatchQueue.global().async {
        URLSession.shared.dataTask(with: url) { (data, _, error) in
            if error != nil {
                DispatchQueue.main.async {
                    compeletd(false, error!)
                }
            } else {
                let json = try? JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
                DispatchQueue.main.async {
                    compeletd(true, json!)
                }
            }
        }.resume()
    }
}

相关文章

评论列表

发表评论:
验证码

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。