gpt4 book ai didi

ios - 使用 NotificationCenter 的加载器

转载 作者:搜寻专家 更新时间:2023-10-31 22:25:01 24 4
gpt4 key购买 nike

我有代码:

主视图.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 或至少有效地使用 completion handlers

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com