线程与加载飞溅同步
Thread synchronization with loading splash
我有这个代码:
struct ServerConnect {
enum Result<T> {
case succes(T)
case error(String)
}
typealias completionHandler = (Result<Data >) -> ()
func getJsonFromServer(parameters: String, completion: @escaping completionHandler) {
let fullUrlString = ApiConstans.fullPath + parameters
guard let url = URL(string: fullUrlString) else {
return completion(.error("ServerConnect01 - Error 100: Problem with url "))
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard error == nil else {
return completion(.error("ServerConnect02 - Error 101: Problem with data "))
}
guard let data = data else {
return completion(.error("ServerConnect03 - Error 103: Problem with data "))
}
return completion(.succes(data))
}.resume()
}
func checkUsersLogin(login: String?, password: String?, completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=LOGOWANIE&login=\(login!)&password=\(password!)", completion: completion)
}
func getJsonProducts( completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_PRODUCTS&lang=" + (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "®ion=" + String((AppGlobalManager.sharedManager.loggedUser?.selectedRegion)!), completion: completion)
}
func getJsonRegions( completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_REGIONS&lang=" + (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)!, completion: completion)
}
func getJsonNews( completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_KARTY_AKTUALNOSCI&lang=" + (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "®ion=" + String((AppGlobalManager.sharedManager.loggedUser?.selectedRegion)!)+"&userType=" + (AppGlobalManager.sharedManager.loggedUser?.userType)! + "&iOS", completion: completion)
}
}
cms.getJsonProducts(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage1".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskProducts(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 101: Configuration files can not be created. \(error)", title: "Blad".localized())
break
}
})
cms.getJsonNews( completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage2".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskNews(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 105: News files can not be created. \(error)", title: "Blad".localized())
break
}
})
cms.getJsonRegions(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage3".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskRegions(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 106: Regions files can not be created. \(error)", title: "Blad".localized())
break
}
})
在每个函数中,显示加载程序:
DispatchQueue.main.async { EZLoadingActivity.show("LoadingMessage1".localized(), disableUI: true)
}
我希望在所有三个线程完成后 (cms.getJsonProducts, cms.getJsonRegions, cms.getJsonNews) ,加载程序已被隐藏。怎么做?你如何同步这 3 个线程来隐藏这个加载器?
有人知道怎么做吗?
您可以使用调度组来等待每个请求
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
cms.getJsonProducts(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage1".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskProducts(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 101: Configuration files can not be created. \(error)", title: "Blad".localized())
break
}
dispatchGroup.leave()
})
dispatchGroup.enter()
cms.getJsonNews( completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage2".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskNews(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 105: News files can not be created. \(error)", title: "Blad".localized())
break
}
dispatchGroup.leave()
})
dispatchGroup.enter()
cms.getJsonRegions(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage3".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskRegions(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 106: Regions files can not be created. \(error)", title: "Blad".localized())
break
}
dispatchGroup.leave()
})
dispatchGroup..notify(queue: .main) {
//Done with everything.
}
我有这个代码:
struct ServerConnect {
enum Result<T> {
case succes(T)
case error(String)
}
typealias completionHandler = (Result<Data >) -> ()
func getJsonFromServer(parameters: String, completion: @escaping completionHandler) {
let fullUrlString = ApiConstans.fullPath + parameters
guard let url = URL(string: fullUrlString) else {
return completion(.error("ServerConnect01 - Error 100: Problem with url "))
}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard error == nil else {
return completion(.error("ServerConnect02 - Error 101: Problem with data "))
}
guard let data = data else {
return completion(.error("ServerConnect03 - Error 103: Problem with data "))
}
return completion(.succes(data))
}.resume()
}
func checkUsersLogin(login: String?, password: String?, completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=LOGOWANIE&login=\(login!)&password=\(password!)", completion: completion)
}
func getJsonProducts( completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_PRODUCTS&lang=" + (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "®ion=" + String((AppGlobalManager.sharedManager.loggedUser?.selectedRegion)!), completion: completion)
}
func getJsonRegions( completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_REGIONS&lang=" + (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)!, completion: completion)
}
func getJsonNews( completion: @escaping completionHandler) {
self.getJsonFromServer(parameters: "?action=GET_KARTY_AKTUALNOSCI&lang=" + (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "®ion=" + String((AppGlobalManager.sharedManager.loggedUser?.selectedRegion)!)+"&userType=" + (AppGlobalManager.sharedManager.loggedUser?.userType)! + "&iOS", completion: completion)
}
}
cms.getJsonProducts(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage1".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskProducts(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 101: Configuration files can not be created. \(error)", title: "Blad".localized())
break
}
})
cms.getJsonNews( completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage2".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskNews(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 105: News files can not be created. \(error)", title: "Blad".localized())
break
}
})
cms.getJsonRegions(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage3".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskRegions(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 106: Regions files can not be created. \(error)", title: "Blad".localized())
break
}
})
在每个函数中,显示加载程序:
DispatchQueue.main.async { EZLoadingActivity.show("LoadingMessage1".localized(), disableUI: true)
}
我希望在所有三个线程完成后 (cms.getJsonProducts, cms.getJsonRegions, cms.getJsonNews) ,加载程序已被隐藏。怎么做?你如何同步这 3 个线程来隐藏这个加载器?
有人知道怎么做吗?
您可以使用调度组来等待每个请求
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
cms.getJsonProducts(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage1".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskProducts(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 101: Configuration files can not be created. \(error)", title: "Blad".localized())
break
}
dispatchGroup.leave()
})
dispatchGroup.enter()
cms.getJsonNews( completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage2".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskNews(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 105: News files can not be created. \(error)", title: "Blad".localized())
break
}
dispatchGroup.leave()
})
dispatchGroup.enter()
cms.getJsonRegions(completion: { (data) in
switch data {
case .succes(let data):
DispatchQueue.main.async {
EZLoadingActivity.show("LoadingMessage3".localized(), disableUI: true)
}
self.saveJsonFileToTheDiskRegions(path: (AppGlobalManager.sharedManager.loggedUser?.selectedLanguage)! + "/json", downloadData: data)
case .error(let error):
self.errorLoginMessage(txt: "MainView - Error 106: Regions files can not be created. \(error)", title: "Blad".localized())
break
}
dispatchGroup.leave()
})
dispatchGroup..notify(queue: .main) {
//Done with everything.
}