线程与加载飞溅同步

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)! + "&region=" + 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)! + "&region=" + 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.
      }