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 和 [弱按钮]的主要内容,如果未能解决你的问题,请参考以下文章

弱委托和 .xib 文件

返回方法中的 sendAsynchronousRequest 和 completionHandler

弱引用委托未恢复

如何使用 Swifts DispatchQueue() 和 completionHandlers 组织网络登录?

NSURLSession,多数据任务,completionHandler

Alamofire 和 completionHandler 的使用