在 swift 登录中正确使用 DispatchQueue
Proper use of DispatchQueue in swift login
我没有正确使用 DispatchQueue 功能,因为我必须单击 2-3 次才能更改屏幕,因为数据没有按时加载。我在代码中尝试了几个位置,但我总是得到相同的结果。
什么是正确使用?
这是我的代码:
func startLogin() {
userNameData = userName.text!.trimmingCharacters(in: .whitespacesAndNewlines)
passwordData = password.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if userNameData == "" || passwordData == "" { return } else {
let parameters = "{\n\t\"user\": \"\(userNameData)\",\n\t\"password\": \"\(passwordData)\"\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "https://someurl.io:18999/salesAPI/login")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
print("User no encontrado!")
return
}
print(String(data: data, encoding: .utf8)!)
// semaphore.signal()
let decoder = JSONDecoder()
do {
let jsonPetitions = try decoder.decode(Token.self, from: data)
token = jsonPetitions.access_token
let defaults = UserDefaults.standard
defaults.set(true, forKey: "didLogin")
defaults.set(userNameData, forKey: "userNameData")
defaults.set(passwordData, forKey: "passwordData")
defaults.set(token, forKey: "enterKey")
}
catch {
print("No Json output!!")
return
}
}
func changeScreen() {
// performSegue(withIdentifier: "switchScreens", sender: nil)
let homeViewController = self.storyboard?.instantiateViewController(identifier: Constance.Storyboard.homeViewController) as? HomeViewController
self.view.window?.rootViewController = homeViewController
self.view.window?.makeKeyAndVisible()
}
dispatchGroup.enter()
task.resume()
self.dispatchGroup.leave()
dispatchGroup.notify(queue: DispatchQueue.main) {
if token == "" {
self.errorLabel.alpha = 0.5
self.errorLabel.text = "Algun dato esta mal"
self.errorLabel.textColor = UIColor.red
print ("No Token! User or the pass is wrong")
} else {
changeScreen()
}
}
} // end User Login
}
代码只是其中的一部分,但所有重要的部分都在那里
调度组使用不当。但与其试图修复它,不如将其删除,因为它是不必要的。解析数据后,只需将 notify
块内的代码移动到 dataTask
闭包中即可。
例如:
func startLogin() {
userNameData = userName.text!.trimmingCharacters(in: .whitespacesAndNewlines)
passwordData = password.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if userNameData == "" || passwordData == "" { return }
let parameters = ["user": userNameData, "password": passwordData]
var request = URLRequest(url: URL(string: "https://someurl.io:18999/salesAPI/login")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = try! JSONEncoder().encode(parameters)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
print("User no encontrado!")
return
}
let decoder = JSONDecoder()
do {
let jsonPetitions = try decoder.decode(Token.self, from: data)
token = jsonPetitions.access_token
let defaults = UserDefaults.standard
defaults.set(true, forKey: "didLogin")
defaults.set(userNameData, forKey: "userNameData")
defaults.set(passwordData, forKey: "passwordData")
defaults.set(token, forKey: "enterKey")
DispatchQueue.main.async {
if token == "" {
self.errorLabel.alpha = 0.5
self.errorLabel.text = "Algun dato esta mal"
self.errorLabel.textColor = UIColor.red
print ("No Token! User or the pass is wrong")
} else {
self.changeScreen()
}
}
} catch {
print("No Json output!!")
return
}
}
task.resume()
}
func changeScreen() {
// performSegue(withIdentifier: "switchScreens", sender: nil)
let homeViewController = self.storyboard?.instantiateViewController(identifier: Constance.Storyboard.homeViewController) as? HomeViewController
self.view.window?.rootViewController = homeViewController
self.view.window?.makeKeyAndVisible()
}
我没有正确使用 DispatchQueue 功能,因为我必须单击 2-3 次才能更改屏幕,因为数据没有按时加载。我在代码中尝试了几个位置,但我总是得到相同的结果。 什么是正确使用? 这是我的代码:
func startLogin() {
userNameData = userName.text!.trimmingCharacters(in: .whitespacesAndNewlines)
passwordData = password.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if userNameData == "" || passwordData == "" { return } else {
let parameters = "{\n\t\"user\": \"\(userNameData)\",\n\t\"password\": \"\(passwordData)\"\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "https://someurl.io:18999/salesAPI/login")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
print("User no encontrado!")
return
}
print(String(data: data, encoding: .utf8)!)
// semaphore.signal()
let decoder = JSONDecoder()
do {
let jsonPetitions = try decoder.decode(Token.self, from: data)
token = jsonPetitions.access_token
let defaults = UserDefaults.standard
defaults.set(true, forKey: "didLogin")
defaults.set(userNameData, forKey: "userNameData")
defaults.set(passwordData, forKey: "passwordData")
defaults.set(token, forKey: "enterKey")
}
catch {
print("No Json output!!")
return
}
}
func changeScreen() {
// performSegue(withIdentifier: "switchScreens", sender: nil)
let homeViewController = self.storyboard?.instantiateViewController(identifier: Constance.Storyboard.homeViewController) as? HomeViewController
self.view.window?.rootViewController = homeViewController
self.view.window?.makeKeyAndVisible()
}
dispatchGroup.enter()
task.resume()
self.dispatchGroup.leave()
dispatchGroup.notify(queue: DispatchQueue.main) {
if token == "" {
self.errorLabel.alpha = 0.5
self.errorLabel.text = "Algun dato esta mal"
self.errorLabel.textColor = UIColor.red
print ("No Token! User or the pass is wrong")
} else {
changeScreen()
}
}
} // end User Login
}
代码只是其中的一部分,但所有重要的部分都在那里
调度组使用不当。但与其试图修复它,不如将其删除,因为它是不必要的。解析数据后,只需将 notify
块内的代码移动到 dataTask
闭包中即可。
例如:
func startLogin() {
userNameData = userName.text!.trimmingCharacters(in: .whitespacesAndNewlines)
passwordData = password.text!.trimmingCharacters(in: .whitespacesAndNewlines)
if userNameData == "" || passwordData == "" { return }
let parameters = ["user": userNameData, "password": passwordData]
var request = URLRequest(url: URL(string: "https://someurl.io:18999/salesAPI/login")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = try! JSONEncoder().encode(parameters)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
print("User no encontrado!")
return
}
let decoder = JSONDecoder()
do {
let jsonPetitions = try decoder.decode(Token.self, from: data)
token = jsonPetitions.access_token
let defaults = UserDefaults.standard
defaults.set(true, forKey: "didLogin")
defaults.set(userNameData, forKey: "userNameData")
defaults.set(passwordData, forKey: "passwordData")
defaults.set(token, forKey: "enterKey")
DispatchQueue.main.async {
if token == "" {
self.errorLabel.alpha = 0.5
self.errorLabel.text = "Algun dato esta mal"
self.errorLabel.textColor = UIColor.red
print ("No Token! User or the pass is wrong")
} else {
self.changeScreen()
}
}
} catch {
print("No Json output!!")
return
}
}
task.resume()
}
func changeScreen() {
// performSegue(withIdentifier: "switchScreens", sender: nil)
let homeViewController = self.storyboard?.instantiateViewController(identifier: Constance.Storyboard.homeViewController) as? HomeViewController
self.view.window?.rootViewController = homeViewController
self.view.window?.makeKeyAndVisible()
}