繁体   English   中英

如何强制Swift等待之前的代码完成?

[英]How to force Swift to wait the previous code is finished?

我刚开始学习Swift,我在后面使用API​​,问题是: Swift不要等待我的函数完成,因此我的最后一个函数看起来像之前没有完成任何代码

import Foundation
import UIKit
import Alamofire
import SwiftyJSON

// Classes
class User {

    init(data: Any) {
        self.sex = JSON(data)["sex"].string!
        print(self.sex)
    }

    var id: Int = 1
    var online: Bool = false
    var picture: String = ""
    var sex: String = "Male"
}

// Fonctions
func getBackground(_ apiURL: String, completion : @escaping(_ :Any) -> Void) {
    // Requête API avec Alamofire + SwiftyJSON
    AF.request(apiURL, method: .get).validate().responseJSON { response in
        switch response.result {
        case .success(let value):
            let jsonData = JSON(value)
            completion(jsonData["results"])
        case .failure(let error):
            print(error)
        }

    }
}

// Requête de connexion
getBackground("https://x..me", completion: { response in
    let user = User(data: response)
})

print(String(user.id) + ": " + String(user.online!))

屏幕截图在这里

我有这个错误:“使用未解析的标识符'user'”,我想Swift并没有得到User先前已定义的事实

我所有的工作都可以与我的API完美配合,在构建代码时会设置并显示“ self.sex”。 但是我仍然被“锁定”,就像在这段代码之后我什么都不做,因为Swift不想等待。

我尝试了异步和同步功能,但是接下来,我所有的下一个代码都必须在一个功能下...

提前致谢

无需等待。

print行和完成用户操作的代码放在完成封口中

getBackground("https://a.clet.me", completion: { response in
    let user = User(data: response)
    print(String(user.id) + ": " + String(user.online!))
})

错误Use of unresolved identifier 'user'是因为局部变量user是唯一的范围(内可见{}其声明的)。

因此,这个问题全与变量生命周期有关。

// This happens first

getBackground("https://a.clet.me", completion: { response in
    let user = User(data: response)

    // This happens third, once the request has completed.

    // user exists here.
    // Only after this moment you should handle anything related to the user
})

// This happens second

// user DOESN'T exist here, swift will move on 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM