在函数之前执行语句

时间:2018-10-03 16:38:31

标签: ios swift

我更新用户数据(这很简单,我只需解析一个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")
}

}

1 个答案:

答案 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!