Как использовать один обратный вызов из синглтона в нескольких представлениях - PullRequest
0 голосов
/ 23 сентября 2018

как использовать onCompleted в представлениях нескольких классов.

ОБНОВЛЕНО ПОЛНЫЙ КОД !!!

import Foundation
import Alamofire

class AudioSyncManager {

    //var onDownloadStart: (()->())?
    var onDownloadFinished: ((_ isSuccess: Bool)->())?
    var onDownloadProgress: ((_ progress: Float)->())?

    static let shared = AudioSyncManager()

    private var downloadRequest: DownloadRequest?
    private var isDownloading = false

    var listData: [MainModel] = []

    func doDownloding(onStarted: @escaping ()->()) {

       if listData.count == 0 || isDownloading {
            return
       }

        let firstModel = listData.first
        if checkMp3FileExists(model: firstModel!) {

            self.isDownloading = false
            self.listData.removeFirst()

            if self.listData.count > 0 {
                self.doDownloding {}
            }

            return

        }

        let mp3URLString = MyHelper.MEDIA_URL_PREFIX + (firstModel?.link)!
        let url = URL(string: mp3URLString)

        let destination = DownloadRequest.suggestedDownloadDestination(for: FileManager.SearchPathDirectory.documentDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)

        //isDownloading = true
        onStarted()

        downloadRequest = Alamofire.download(url!, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil, to: destination)
            .downloadProgress { (progress) in

            self.onDownloadProgress?(Float(progress.fractionCompleted))

            }.response { (response) in

                self.isDownloading = false
                self.onDownloadFinished?(true)

                if self.listData.count > 0 {
                    self.listData.removeFirst()
                }

                if self.listData.count > 0 {
                    self.doDownloding{}
                }

        }

    }

    func addSingleTask(mainModel: MainModel) {

        listData.append(mainModel)
        doDownloding{}

    }

    func addListTask(newList: [MainModel]) {

        listData.append(contentsOf: newList)
        doDownloding{}

    }

}

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

POINT 1

Вы должны получить ошибку в строке ниже

     let static shared = Service()

, потому что статическое ключевое слово должно идти первым, а затем объявление.

static let shared = Service()

POINT 2

Реализация функции onDownload с помощью обработчика завершения

    func doDownload(onCompleted: @escaping ()->()) {
    onCompleted()
    }

Вызовите функцию, как показано ниже

    let service = Service.shared
    service.doDownload { () in
        print("Called in completion Handler")
    }

для получения более подробной информациио замыканиях перейдите по ссылке ниже. Затворы

0 голосов
/ 23 сентября 2018

Ваш код в viewDidLoad выглядит хорошо, но не могли бы вы снова посетить свой синглтон-класс и попытаться запустить ваш код после добавления частного метода init, вызывающего super.init, и посмотреть, работает ли ваш код.

0 голосов
/ 23 сентября 2018

Пример удалить свойство onCompleted и сделать его параметром для doDownload method :

class Service {
     let static shared = Service()

     func doDownload(onCompleted: (()->())?) {
          //...
          onCompleted?()
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...