2016-12-24 197 views
-2

我有一个viewController使用DownloaderDelegate协议与DownloaderHandler进行通信。为什么我的方法没有被调用?

我的协议被定义为:

protocol DownloaderDelegate : class { 

    func didReceive(data:Data) 
} 

我有一个的viewController

class ViewController: UIViewController { 
weak var downloadHandler : DownloaderHandler?  

override func viewDidLoad() { 
    super.viewDidLoad() 
    downloadHandler = DownloaderHandler() 
    downloadHandler?.delegate = self 
    changeBackground() 

} 

func changeBackground(){ 
     let googleURL = URL(fileURLWithPath: "https://www.google.com/doodle4google/images/splashes/featured.png") 
     print(googleURL) 
     downloadHandler?.downloadData(url:googleURL) // Line BB 
    } 
} 

extension ViewController : DownloaderDelegate{ 
    func didReceive(data: Data) { 
     let image = UIImage(data: data) 
     let imageView = UIImageView(image: image!) 
     view.insertSubview(imageView, at: 0) 
    } 
} 

而且我有一个委派类为:

class DownloaderHandler : NSObject, URLSessionDelegate{ 
    weak var delegate :DownloaderDelegate? 
    var downloadsSession: URLSession = { 
     let configuration = URLSessionConfiguration.default 
     let session = URLSession(configuration: configuration) 
     return session // Line AA 
    }() 

    func downloadData(url: URL){ // Line CC 
     downloadsSession.dataTask(with: url){ data, response, error in 
      print("error is \(error), data is \(data) and response is \(response)") // Line DD 

      if let badError = error { 
       print(" the url didn't succeeed error is \(badError.localizedDescription)") 
      } 
      else if let someResponse = response as? HTTPURLResponse { 
       if someResponse.statusCode == 200{ 
        self.delegate?.didReceive(data: data!) 
       } 
      } 

     } 

    } 
} 

使用断点:行AA,得到加载。 BB线电话。 CC线永远不会被调用。为什么?我究竟做错了什么?!

回答

4

您已经声明:

weak var downloadHandler : DownloaderHandler?  

然后你说:

downloadHandler = DownloaderHandler() 

downloadHandlerweak参考,并没有别的保留了这一DownloaderHandler实例,因此它后消失在一团烟雾被建造。您的日志记录显示它正在创建,但如果您要登录其deinit,那么以后您会看到它立即消失。当你说downloadHandler?.downloadData(url:googleURL),你的downloadHandler参考是nil,所以什么也没有发生;你在那个时候没有人跟你说话。

[您可能会严格遵循一个精神规则,委托引用应该很弱。但是这个规则的前提是假设代表具有独立存在性,因此不应该被推荐人“拥有”。但是,这个客体没有独立存在;它更像是一个装饰器对象(我称之为助手)。因此,参考需要很强。反向参考仍然很弱,因此您不会得到循环保留周期。]

+0

哈我误认这个'弱var委托:DownloaderDelegate? '。 – Honey

+0

我已经添加了一个段落,试图猜测你在错误中的位置...... :) – matt

+0

我删除了'weak'。现在我点击CC线,但我从来没有达到DD线,即完成处理程序中没有任何内容被执行。我的完成处理程序有什么问题吗? – Honey

1

从视图控制器上的downloadHandler属性中删除“弱”限定符。

由于它是downloadHandler对象的唯一引用,所以只要viewDidLoad方法执行完毕,它就会从内存中移除。

你可以做一个小测试;添加一个断点到BB行,并检查downloadHandler是否有值。我怀疑它会是“无”,因为它是一个薄弱的财产。

相关问题