【问题标题】:global variable not contain value on viewdidload in swift全局变量不包含 swift 中 viewdidload 的值
【发布时间】:2018-04-21 13:06:54
【问题描述】:

在 jsonserialization 方法下打印时包含数据 (1) 的变量,但在 viewdidload 中显示 nil value(0)

    var bank = Int()

    func getProfile() {
    .
    .
    .
    .
    let json = try JSONSerialization.jsonObject(with: data) as! [String: Any]
    print("json \(json)")

let status = json["Success"] as! Bool

if status {
//send profile update status 1
//After Alert Success
    DispatchQueue.main.async {
        if let banks = (json["bank"] as? NSString)?.intValue {


            print("banks\(banks)")
            self.bank = Int(banks)
            print("self.bank\(self.bank)")
        }
}



} else {


}
}

在 viewdidload 下调用的变量显示 0(nil) 值

    override func viewDidLoad() {
    getProfile()
    print("bank \(bank)")
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

输出:银行 0

【问题讨论】:

  • 你在哪里调用包含json序列化和完整代码的函数
  • viewDIdLoad 在视图加载后立即调用,如果您将自定义函数放置在 viwDidLoad 或其他位置,则执行该函数
  • 在 viewdidload 中,... getProfile()
  • 我已经更新了代码@MoazKhan
  • 属性未设置在viewDidLoad 的原因是因为您在DispatchQueue 中异步设置它。您正在另一个线程中获取和设置您的属性。如果要在设置属性时收到通知,则需要使用回调或委托。

标签: ios swift global-variables nsjsonserialization


【解决方案1】:

主要问题是未设置变量,因为 web 服务是在另一个线程中调用的,并且该变量在被 web 服务加载之前就被打印出来了。

尝试在某个按钮中再次调用它,您将看到您的结果将完美打印

【讨论】:

  • 我需要这个视图加载而不是按钮点击
  • 我知道,但你没有明白我的意思。我只是说它没有显示出来,因为你正在做的工作在另一个线程视图中已经加载,并且在你的线程完成并给你结果之后已经打印了 0。完成后,除非您重新加载,否则您无法期待结果。
  • 那你没做对。所有 swift 开发人员都使用线程并且每天都这样做。为了使事情更清楚,需要您提供更多背景信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多