我有代码:
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/