我更新用户数据(这很简单,我只需解析一个Json并将其保存到全局变量和coredata对象中),但问题是该函数之后的语句在该函数之前执行。
UpdateUserData()
print(User.user)
在上面的函数中,我调用了另一个文件中的公共函数,但是打印抛出一个空字典,并带有断点,我注意到在该函数之前执行了print语句
更新: 这是获取数据的方法
public func UpdateUserData(){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Usuarios")
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
for dataCoreValue in result as! [NSManagedObject] {
let urlString = "http://13.59.219.129/apostologo/api/v1/usuarios/\(dataCoreValue.value(forKey: "id") as! String)"
print(urlString)
let url = NSURL(string: urlString)!
let urlSession = URLSession.shared
let jsonQuery = urlSession.dataTask(with: url as URL, completionHandler: {
data, response, error -> Void in
if (error != nil) {
}else{
let jsonResult = (try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)) as! NSDictionary
DispatchQueue.main.async {
Usuario.usuario = ["id":String(describing: (jsonResult["usuarios"] as! NSDictionary)["id_usuario"] as! NSNumber),
"correo":(jsonResult["usuarios"] as! NSDictionary)["correo"] as! String,
"fecha_nacimiento":(jsonResult["usuarios"] as! NSDictionary)["fecha_nacimiento"] as! String,
"nombre":"\((jsonResult["usuarios"] as! NSDictionary)["nombres"] as! String) \((jsonResult["usuarios"] as! NSDictionary)["apellidos"] as! String)",
"tipo":(jsonResult["usuarios"] as! NSDictionary)["tipo"] as! String,
"token": Int((jsonResult["usuarios"] as! NSDictionary)["token"] as! String)!]
DispatchQueue.main.async {
dataCoreValue.setValue(Usuario.usuario["token"] as! Int, forKey: "tokens")
dataCoreValue.setValue(Usuario.usuario["token"] as! Int, forKey: "tokens")
dataCoreValue.setValue(Usuario.usuario["token"] as! Int, forKey: "tokens")
dataCoreValue.setValue(Usuario.usuario["token"] as! Int, forKey: "tokens")
dataCoreValue.setValue(Usuario.usuario["token"] as! Int, forKey: "tokens")
dataCoreValue.setValue(Usuario.usuario["token"] as! Int, forKey: "tokens")
do {
try context.save()
print("saved!")
} catch let error as NSError {
print("Could not save \(error), \(error.userInfo)")
}
}
}
}
})
jsonQuery.resume()
}
} catch {
print("Failed")
}
}
答案 0 :(得分:0)
UpdateUserData()
是异步的,因为它正在发出网络请求,这就是在更新用户数据之前在主线程中执行print
语句的原因。
您可以在操场上尝试:
DispatchQueue.main.async {
print("Hello")
}
print("world!")
打印
world!
Hello
如果您想执行执行顺序,可以使用Dispatch groups:
let group = DispatchGroup()
group.enter()
DispatchQueue.main.async {
print("Hello")
group.leave()
}
group.notify(queue: .main) {
print("world!")
}
//Hello
//world!