我在情节提要中创建了一个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()
}
}
您在服务器调用中设置标签的文本,这不能保证在主线程上。所有 UI 更新都需要在主线程上进行。试试这个:
DispatchQueue.main.async {
self.RandomString.text = responseString as String?
}