Синхронизация потоков с загрузкой заставки - PullRequest
0 голосов
/ 22 мая 2018

У меня есть этот код:

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 потока, чтобы скрыть этот загрузчик?

Кто-нибудь знает, как это сделать?

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете использовать группы рассылки для ожидания каждого запроса

    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.
      }
...