簡體   English   中英

使用NotificationCenter的加載器

[英]Loader with use NotificationCenter

我有代碼:

MainView.swift:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        // Register to receive notification
        NotificationCenter.default.addObserver(self, selector: #selector(MainViewControler.StartUpdatingSplash), name: NSNotification.Name("StartUpdatingSplashNotificationName"), object: nil)

        //new code
        NotificationCenter.default.addObserver(self, selector: #selector(MainViewControler.FinishUpdatingSplash), name: NSNotification.Name("FinishUpdatingSplashNotificationName"), object: nil)

    }

    @objc func StartUpdatingSplash() {
        DispatchQueue.global().async {
            EZLoadingActivity.show("LoadingMessage4".localized(), disableUI: true)
        }
        print("##### NOTIFICATION STEP: 1")
    }

    @objc func FinishUpdatingSplash() {
        DispatchQueue.global().async {
            EZLoadingActivity.hide()
        }
        // Stop listening notification
        NotificationCenter.default.removeObserver(self, name: Notification.Name("StartUpdatingSplashNotificationName"), object: nil)
        print("##### NOTIFICATION FINISH STEP: 2")
    }

App.swift:

var filesToDownload = [FilesToDownload]()
var filesToDownloadPDF = [FilesToDownload]()

struct FilesToDownload {
    var fileInternetUrl: String?
    var fileName: String?
    var savedURL: String?
    var productImageUrl: URL?
    var fileSize: Int
}    

func startDownloadFiles(filesArray: [FilesToDownload], filesType: Int){
        // Post notification
        NotificationCenter.default.post(name: Notification.Name("StartUpdatingSplashNotificationName"), object: nil)
        for files in filesArray{
            if filesType == 1 {
                print ("PLIKI DO SCIAGNIECIA: \(files)")
                checkRemoteImage(fileInternetUrl: files.fileInternetUrl!, fileName: files.fileName!, savedURL: files.savedURL!, productImageUrl: files.productImageUrl!, fileSize: files.fileSize)
            } else {
                print ("PLIKI DO SCIAGNIECIA PDF: \(files)")
                checkRemotePdf(fileInternetUrl: files.fileInternetUrl!, fileName: files.fileName!, savedURL: files.savedURL!, productPdfUrl: files.productImageUrl!, fileSize: files.fileSize)
            }
        }
    }

func checkRemoteImage(fileInternetUrl: String, fileName: String, savedURL: String, productImageUrl: URL, fileSize: Int){
        remoteResource(at: productImageUrl, fileSize: fileSize) { (isImage) in
            if isImage == true {
                self.saveDownloadFiles(fileInternetUrl: productImageUrl, fileName: fileName, savedURL: savedURL)
            }
        }
    }

    func checkRemotePdf(fileInternetUrl: String, fileName: String, savedURL: String, productPdfUrl: URL, fileSize: Int){
        self.saveDownloadFiles(fileInternetUrl: productPdfUrl, fileName: fileName, savedURL: savedURL)
    }


    func saveDownloadFiles(fileInternetUrl: URL, fileName: String, savedURL: String){
        let cms = ServerConnect()
        cms.downloadedFileFromInternet(fileInternetUrl: fileInternetUrl, directory: savedURL, fileName: fileName ,  completion: { (data) in
            switch data {
            case .succes:
                print("DOWNLOAD: \(savedURL)/\(fileName)")
            case .error(let error):
                //self.errorLoginMessage(txt: "MainView - Error 110: Problem with download images. \(error)", title: "Blad".localized())
                print("")
                break
            }
        })
    }


func downloadedFileFromInternet(fileInternetUrl: URL, directory: String, fileName: String , completion: @escaping completionHandler) {
        if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
            let fileURL = dir.appendingPathComponent(directory)

            if !FileManager.default.fileExists(atPath: fileURL.path) {
                do {
                    try FileManager.default.createDirectory(atPath: fileURL.path, withIntermediateDirectories: true, attributes: nil)
                } catch {
                    NSLog("Couldn't create document directory")
                }
            }
            do {
                let data = try? Data(contentsOf: fileInternetUrl)
                try data?.write(to: fileURL.appendingPathComponent(fileName), options: .atomic)
            } catch let error {
                print("Error : \(error.localizedDescription)")
            }

        } 
    }

在函數startDownloadFiles中,我開始下載我的文件。 我想在下載文件時使用show loader (EZLoadingActivity)

目前,在啟動splash (loader EZLoadingActivity)應用程序后,啟動(loader EZLoadingActivity)始終可見,下載所有文件后不會隱藏。

如何隱藏這些EZLoadingActivity畢竟文件從文件下載FileToDownload / filesToDownloadPDF

您可以在以下完成中觸發通知

let cms = ServerConnect()
    cms.downloadedFileFromInternet(fileInternetUrl: fileInternetUrl, directory: savedURL, fileName: fileName ,  completion: { (data) in

       NotificationCenter.default.post(name: Notification.Name("FinishUpdatingSplashNotificationName"), object: nil)

        switch data {
        case .succes:
            print("DOWNLOAD: \(savedURL)/\(fileName)")
        case .error(let error):
            //self.errorLoginMessage(txt: "MainView - Error 110: Problem with download images. \(error)", title: "Blad".localized())
            print("")
            break
        }
    })

我注意到你正在進行網絡呼叫的其他幾個地方。 因此,如果您在使用這些方法發出請求之前顯示加載程序,那么您也應該在此處觸發此通知。 例如,

URLSession.shared.dataTask(with: fileUrl) { (data, response
        , error) in
    NotificationCenter.default.post(name: Notification.Name("FinishUpdatingSplashNotificationName"), object: nil)
}

然后在你的監聽器方法中,你應該有邏輯來知道它是否是隱藏加載器的正確時間。

建議使用通知不是處理您嘗試處理的內容的好方法。 它將為您管理競爭條件增加很多努力。 我建議您檢查PromiseKit或至少有效地使用completion handlers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM