completionHandler 和 [弱按钮]
Posted
技术标签:
【中文标题】completionHandler 和 [弱按钮]【英文标题】:completionHandler and [weak button] 【发布时间】:2014-12-12 10:36:45 【问题描述】:大家好,
我有这些源代码
let downloadTask = session.downloadTaskWithURL(url,
completionHandler:
[weak button] url, response, error in
if error == nil && url != nil
if let data = NSData(contentsOfURL: url)
if let image = UIImage(data: data)
dispatch_async(dispatch_get_main_queue())
if let button = button
button.setImage(image, forState: .Normal)
此代码块尝试将来自 url 的图像放入按钮元素中。 有人可以帮我理解为什么在这个源代码块中,在completionHandler 参数列表中它使用[弱按钮]? [weak ...] 是什么意思,为什么要使用它? (我认为避免保留循环。) 谢谢各位!
【问题讨论】:
附注:不要勾选error == nil
,如果操作成功,不保证是nil
***.com/a/1810301/2128900
查看苹果文档:developer.apple.com/library/ios/documentation/Swift/Conceptual/…
【参考方案1】:
这不是一个参数,它只是声明函数中对按钮的每次调用都是对按钮的弱引用。 这是在闭包内使用对对象的弱引用的快捷方式。
这相当于Objective-C:
UIButton * __weak button = ...
【讨论】:
【参考方案2】:[weak button]
表示按钮参数是可选的,执行完成处理程序时可以为nil。因此,完成块中可能不存在该按钮。您也可以使用[unowned button]
,但前提是您确定该按钮存在,否则它将崩溃。第三个选项是在按钮之前不要使用neithor weak 或unowned,这意味着在执行闭包之前,它将保持对按钮的强引用并且不会让它被deinited。
【讨论】:
以上是关于completionHandler 和 [弱按钮]的主要内容,如果未能解决你的问题,请参考以下文章
返回方法中的 sendAsynchronousRequest 和 completionHandler
如何使用 Swifts DispatchQueue() 和 completionHandlers 组织网络登录?