簡體   English   中英

swift 4錯誤:' - [UIKeyboardTaskQueue waitUntilAllTask​​sAreFinished]可能只能從主線程調用

[英]swift 4 error : '-[UIKeyboardTaskQueue waitUntilAllTasksAreFinished] may only be called from the main thread

當互聯網連接處於活動狀態時,該應用程序運行良 但是,我嘗試關閉互聯網連接,我嘗試使用終點。

我收到了這個錯誤:

***由於未捕獲的異常'NSInternalInconsistencyException'而終止應用程序,原因:' - [UIKeyboardTaskQueue waitUntilAllTask​​sAreFinished]只能從主線程調用。

幾點:

a)首先,我不清楚我應該在哪個地方使用異步 - 我在switch語句中將它放在兩個不同的情況下。

b)其次,我是否使用error.localizedDescription處理錯誤? 我想要做的是找到一種方法來處理互聯網關閉時的1009錯誤。

如果我要求不必要的長答案,請引導我到我可以閱讀的資源。

 let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let error = error{
                self.errorMessage += "Data Gathering Error: " + error.localizedDescription + "\n"
                completion(self.errorMessage, nil)
                return

        } else if let data = data, let response = response as? HTTPURLResponse{
            print(response.statusCode)

            if response.statusCode == 200 {
                do {
                    switch relativeURL{
                    case .requestOTP:
                        print("------------")
                        print(String(data: data, encoding: .utf8)!)
                        print("------------")

                        let responseInfo = try JSONDecoder().decode(loginResponse.self, from: data)
                        print(responseInfo.success)
                        print(responseInfo.message)
                      DispatchQueue.main.async {
                        let dataReceived = responseData(loginResponse: .init(success: responseInfo.success, error: .init(message:responseInfo.error?.message), message: responseInfo.message), decodeOTPResponse: nil,quotaResponse:nil,UserAddResponse:nil)

                        print(dataReceived)

                                    completion(nil,dataReceived)
                        }



                    case .loginWithOTP:
                        let responseInfo = try JSONDecoder().decode(decodeOTPResponse.self, from: data)


                        let dataReceived = responseData(loginResponse: nil, decodeOTPResponse: .init(success: responseInfo.success, token: responseInfo.token, error: .init(message:responseInfo.error?.message), totp_secret: responseInfo.totp_secret),quotaResponse:nil,UserAddResponse:nil)
                        print(dataReceived)

                        DispatchQueue.main.async {
                            completion(nil,dataReceived)

                        }
                    case .addUser:
                        let responseInfo = try JSONDecoder().decode(UserAddResponse.self, from: data)
                        print(responseInfo)

                        let dataReceived = responseData(loginResponse: nil, decodeOTPResponse: nil, quotaResponse: nil, UserAddResponse:.init(success: responseInfo.success, error:.init(message:responseInfo.error?.message), message: responseInfo.message))
                        DispatchQueue.main.async {
                            completion(nil,dataReceived)
                        }


                    default:
                        completion("Wrong request call",nil)
                        return
                    }


                } catch let jsError{
                    print("Error serialising JSON", jsError)
                    completion("Error Serialising JSON",nil)
                    return

                }
            } else if response.statusCode > 401 && response.statusCode < 500{

                print("Unauthorized to perform action")


            } else if response.statusCode == 500{

                print("endpoint not found")

            } 

        }

    }
    task.resume()

嘗試覆蓋主隊列中的所有completion()(不確定這會工作但是試試這個。)

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let error = error{
        self.errorMessage += "Data Gathering Error: " + error.localizedDescription + "\n"
        DispatchQueue.main.async {
            completion(self.errorMessage, nil)
        }
        return

    } else if let data = data, let response = response as? HTTPURLResponse{
        print(response.statusCode)

        if response.statusCode == 200 {
            do {
                switch relativeURL{
                case .requestOTP:
                    print("------------")
                    print(String(data: data, encoding: .utf8)!)
                    print("------------")

                    let responseInfo = try JSONDecoder().decode(loginResponse.self, from: data)
                    print(responseInfo.success)
                    print(responseInfo.message)
                    DispatchQueue.main.async {
                        let dataReceived = responseData(loginResponse: .init(success: responseInfo.success, error: .init(message:responseInfo.error?.message), message: responseInfo.message), decodeOTPResponse: nil,quotaResponse:nil,UserAddResponse:nil)

                        print(dataReceived)

                            completion(nil,dataReceived)
                    }

                case .loginWithOTP:
                    let responseInfo = try JSONDecoder().decode(decodeOTPResponse.self, from: data)

                    let dataReceived = responseData(loginResponse: nil, decodeOTPResponse: .init(success: responseInfo.success, token: responseInfo.token, error: .init(message:responseInfo.error?.message), totp_secret: responseInfo.totp_secret),quotaResponse:nil,UserAddResponse:nil)
                    print(dataReceived)

                    DispatchQueue.main.async {
                        completion(nil,dataReceived)

                    }
                case .addUser:
                    let responseInfo = try JSONDecoder().decode(UserAddResponse.self, from: data)
                    print(responseInfo)

                    let dataReceived = responseData(loginResponse: nil, decodeOTPResponse: nil, quotaResponse: nil, UserAddResponse:.init(success: responseInfo.success, error:.init(message:responseInfo.error?.message), message: responseInfo.message))
                    DispatchQueue.main.async {
                        completion(nil,dataReceived)
                    }

                default:
                    DispatchQueue.main.async {
                        completion("Wrong request call",nil)
                    }

                    return
                }

            } catch let jsError{
                print("Error serialising JSON", jsError)
                DispatchQueue.main.async {
                    completion("Error Serialising JSON",nil)
                }
                return
            }
        } else if response.statusCode > 401 && response.statusCode < 500{
            print("Unauthorized to perform action")

        } else if response.statusCode == 500{

            print("endpoint not found")

        }
    }
}
task.resume()

我也遭受了這個錯誤兩天。 直到我把我的代碼放進去

DispatchQueue.main.asyn

    do {
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary

            if let parseJSON = json {

                DispatchQueue.main.async {
                let userId = parseJSON["firstName"] as? String
                print("User id: \(String(describing: userId!))")

                if (userId?.isEmpty)!
                {
                    // Display an Alert dialog with a friendly error message
                    self.showAlert(title: "Request Error", message: "Could not successfully perform this request. Please try again later")
                    return
                } else {
                    self.showAlert(title: "SignIn Successfully", message: "Successfully Registered a New Account. Please proceed to Sign in")

                }

                }

            }
            else {
                //Display an Alert dialog with a friendly error message
                //                        self.showAlert(title: "Request Error", message: "Could not successfully perform this request. Please try again later")

            }
        } catch {

            // self.removeActivityIndicator(activityIndicator: myActivityIndicator)

            // Display an Alert dialog with a friendly error message
            self.showAlert(title: "Request Error", message: "Could not successfully perform this request. Please try again later")

            print(error)
        }
    }

    task.resume()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM