簡體   English   中英

iOS - Swift:在主線程中從數據庫中獲取數據,而不是在后台

[英]iOS - Swift : fetching data from database in main thread, not in background

在我的 iOS 應用程序中,我能夠從數據庫下載數據,但實際上所有操作都是在后台進行的,主線程仍然處於活動狀態,甚至是 GUI。 我也試着和

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) { ... }

有了這個延遲,一切都可以正常工作,但這不是一個好的解決方案。 如何更改我的代碼以在主線程中執行此操作? 可能與 loadingIndicator。

這是我的代碼(檢查用戶名是否存在):

func CheckIfUsernameExists(username : String, passwordFromDb : inout String, errorMsg : inout String)
{
    //declare parameter as a dictionary which contains string as key and value combination. considering inputs are valid
    var _errorMsg = ""
    var _psw = ""
    var parameters : [String : Any]?
    parameters = ["username": username,
                  "action": "login"]

    print(parameters!)

    let session = URLSession.shared
    let url = "http://www.thetestiosapp.com/LoginFunctions.php"
    let request = NSMutableURLRequest()
    request.url = URL(string: url)!
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField:"Accept")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"Content-Type")

    do{
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters!, options: .sortedKeys)
        let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in
            if let response = response {
                let nsHTTPResponse = response as! HTTPURLResponse
                let statusCode = nsHTTPResponse.statusCode
                print ("status code = \(statusCode)")
            }
            if let error = error {
                print ("\(error)")

            }
            if let data = data {
                do{
                    _psw = self.parseJSON_CheckIfUsernameExists(data, errorMsg: &_errorMsg)
                }
            }
        })
        task.resume()
    }catch _ {
        print ("Oops something happened buddy")
        errorMsg = "Usarname non recuperato (1)"
    }

    passwordFromDb = _psw
    errorMsg = _errorMsg
}

您正在嘗試在此方法結束時更新passwordFromDberrorMsg 但這是一個異步方法,並且那些局部變量_psw_errorMsg設置在閉包內。 與其嘗試將這些變量的檢查推遲到任意三秒鍾,不如在閉包內移動您需要的任何“發布請求”處理。 例如

func CheckIfUsernameExists(username : String, passwordFromDb : inout String, errorMsg : inout String) {
    //declare parameter as a dictionary which contains string as key and value combination. considering inputs are valid

    let parameters = ...

    let session = URLSession.shared
    var request = URLRequest()
    ...

    do {
        request.httpBody = ...
        let task = session.dataTask(with: request) { data, response, error in
            if let httpResponse = response as? HTTPURLResponse,
                let statusCode = httpResponse.statusCode {
                print ("status code = \(statusCode)")
            }

            guard let data = data else {
                print (error ?? "Unknown error")
                return
            }

            let password = self.parseJSON_CheckIfUsernameExists(data, errorMsg: &_errorMsg)
            DispatchQueue.main.async { 
                // USE YOUR PASSWORD AND ERROR MESSAGE HERE, E.G.:
                self.passwordFromDb = password
                self.errorMsg = _errorMsg
                // INITIATE WHATEVER UI UPDATE YOU WANT HERE
            }
        }
        task.resume()
    } catch _ {
        print ("Oops something happened buddy")
        errorMsg = "Usarname non recuperato (1)"
    }
}

暫無
暫無

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

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