2016-12-24 194 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是否有值。我懷疑它會是「無」,因爲它是一個薄弱的財產。

相關問題