为什么这个iOS应用需要很长时间才能将字符串弹出到UILabel?

时间:2017-02-15 15:13:40

标签: ios swift

我在故事板中创建了一个UILabel,以显示来自服务器的响应。但是,从服务器显示字符串需要很长时间。它确实有效,只花了将近1分钟。

我使用print检查服务器是否有任何延迟,但应用程序将在打开应用程序后立即在调试区域中打印响应。我想这应该是应用程序的问题。

我检查代码看起来很好,效果很好。只有延迟问题。谁能有任何想法? (这是使用Swift 3.0 BTW的tvOS应用程序)

import UIKit
import Foundation

class LoginViewController: UIViewController, UITextFieldDelegate, URLSessionDelegate, URLSessionDataDelegate {

    @IBOutlet weak var RandomString: UILabel!

    let UUIDValue = UIDevice.current.identifierForVendor!.uuidString

    func sendRequest(url: String, parameters: String, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionTask {
        let parameterString = parameters
        let requestURL = URL(string:"\(url)\(parameterString)")!

        print("requestURL = \(requestURL)")

        var request = URLRequest(url: requestURL)
        request.httpMethod = "GET"

        let task = URLSession.shared.dataTask(with: request, completionHandler: completionHandler)
        task.resume()

        return task
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.sendRequest(url: "http://www.google.com/api", parameters: UUIDValue, completionHandler:{data, response, error in

            print (self.UUIDValue)

            guard error == nil && data != nil else {
                print("error=\(error)")
                return
            }

            let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)

            print("responseString = \(responseString)")

            //If app receives "true" response from server, go to Home screen.
            if responseString == "true" {
                let viewController:UIViewController = UIStoryboard(name: "Main", bundle:nil).instantiateViewController(withIdentifier: "Tab") as UIViewController

                self.present(viewController, animated: false, completion: nil)
            }
            //If app receives "false" response from server, display the response from server.
            else {
                self.RandomString.text = responseString as String?
            }
        })
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

1 个答案:

答案 0 :(得分:2)

您在服务器调用中设置标签的文本,但不保证在主线程上。所有UI更新都需要在主线程上进行。试试这个:

DispatchQueue.main.async {
    self.RandomString.text = responseString as String?
}