У меня небольшая странная проблема с шаблоном делегата, и я не мог заставить его работать так, как ожидал. Я предполагаю, что я что-то здесь упускаю, но я не мог понять это сам.
Вот как определяются мои классы,
class NetworkManager {
weak var delegate: DownloaderProtocol?
func downloadFile(downloadUrl: URL ) {
downloadTask(with: downloadUrl).resume()
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
delegate?.downloadCompleted(task: task, error: error)
}
}
class DownloadManager: DownloaderProtocol {
var networkManager: NetworkManager
init(networkManager: NetworkManager) {
self.networkManager = networkManager
}
func downloadMatches(urls: [String]) {
self.networkManager.delegate = self
for(....) {
self.networkManager.downloadFile(url: url)
}
}
func downloadCompleted(task: URLSessionTask, error: Error) {
// Implementation
}
}
class Matches {
var networkManager: NetworkManager
init() {
self.networkManager = NetworkManager()
}
func getMatchSchedules(urls: [String] , completionHandler: @escaping (Result<Data, Error>) -> Void) {
return DownloadManager.downloadMatches(urls: [String])
}
}
В чем проблема?
Когда вызывается метод urlSession - didCompleteWithError, я вижу, что объект делегата nil .
Что я пробовал?
- Если я удаляю слабую ссылку делегата, то есть от
weak var delegate: DownloaderProtocol?
до var delegate: DownloaderProtocol?
, тогда объект делегата не равен nil. Это работает нормально. - Я даже пытался установить делегаты в классе Matches, но делегат по-прежнему отображается как nil
Любая помощь или указание приветствуются.