[英]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.