ios - 使用NotificationCenter的加载器

标签 ios swift

我有代码:

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")
    }

应用程序.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 中,我开始下载我的文件。 我想在下载文件时显示加载程序(EZLoadingActivity)

目前,启动启动画面(loader EZLoadingActivity)应用程序后,启动画面始终可见,下载完所有文件后不会隐藏。

从文件 FileToDownload/filesToDownloadPDF 下载所有文件后,如何隐藏这些 EZLoadingActivity

最佳答案

您可以在下面的完成中触发通知

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 或至少有效地使用完成处理程序

关于ios - 使用NotificationCenter的加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943792/

相关文章:

ios - 如何将 TSPopover 合并到我的应用程序中,以免导致运行时崩溃?

objective-c - 如何在iOS中显示复制大文件的进度?

ios - 红蜘蛛:更新 pod 创建编译错误

ios - 在应用程序生命周期的另一个时间请求远程通知授权?

ios - 仅在 iPhone 上出现 dateFormatter dateFromString 错误

ios - Swift 包括 JustHTTP/Just 构建失败

ios - 标签栏图标显示不正确

ios - 删除planeDetection平面可以防止放置额外的平面

multithreading - 核心数据 : warning: Unable to load class named

swift - 收到 PushNotif 时更改 AppDelegate 中 NavBar 的色调