как настроить функцию протокола не правильно вызывать в классе DataProvider Alamofire функция Swift - PullRequest
0 голосов
/ 16 января 2020

Мне нужно установить функцию протокола в функции загрузки Alamofire, чтобы отслеживать и наблюдать значение доли прогресса. Я должен попытаться реализовать функцию делегата, но она не выполняется должным образом, давая ошибку. У меня есть один класс DataProvider, который имеет функцию Alamofire, а затем я вызываю это в ViewController.

Ошибки при получении init(webService: DataProvider = DataProvider()):

'self' used before 'super.init' call
'super.init' isn't called on all paths before returning from initializer

Код ViewController:

let webService: DataProvider

    init(webService: DataProvider = DataProvider()) {
        //super.init()
        self.webService = webService
        self.webService.delegate = self
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

extension DownloadViewController: MyWebServiceProtocol {
    func progress(_ fractionCompleted: Double) {
        print(fractionCompleted)
    }

    func downloadDidSucceed() {
        print("download")
    }


    func downloadDidFail(error: Error) {
        // handle error
    }
}

DataProvider.Class

protocol MyWebServiceProtocol: class {
   func progress(_ fractionCompleted: Double)
   func downloadDidSucceed()
   func downloadDidFail(error: Error)
}

// in class
weak var delegate: MyWebServiceProtocol?

//Alamofire

Alamofire.download(
            url,
            method: .get,
            parameters: nil,
            encoding: JSONEncoding.default,
            headers: nil,
            to: destination).downloadProgress(closure: { (progress) in
                //progress closure
                self.delegate?.progress(progress.fractionCompleted)

                print(progress.fractionCompleted)
            }).response(completionHandler: { (DefaultDownloadResponse) in
                //here you able to access the DefaultDownloadResponse
                //result closure
                callback(DefaultDownloadResponse.response?.statusCode == 200, DefaultDownloadResponse.destinationURL?.absoluteString.replacingOccurrences(of: "file://", with: ""))
                print(DefaultDownloadResponse)
                self.delegate?.downloadDidSucceed()
            })

1 Ответ

0 голосов
/ 16 января 2020

Вы должны вызвать super.init() перед использованием объекта self, чтобы свойства базового класса были инициализированы перед использованием self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...