swift - 变量值为空。为什么?

标签 swift

我是 swift 的新手 我有我的问题。 没有分配变量。 测试变量为什么为空?在循环中编写代码没问题。你帮忙。谢谢

print(test.count) = 0 为什么?

对不起初学英语

var test = ""

ApiClient.shared.login(username:"acilrezervasyon" , password: "acilrezervasyon", successBlock:  { (response, value) in
    let accessToken = value!.accessToken
    Utils.setToken(accessToken!)

    //print(accessToken)

    ApiClient.shared.allProvidersCars(alisKonum: "28", alisTarihi: "2017-11-22", alisSaati: "10:00", teslimKonum: "28", testlimTarihi: "2017-11-23", teslimTarihi: "2017-11-23", teslimSaati: "10:00", successBlock:  { (response, value) in
        let araclarDatasi = value!.data
        // print(araclarDatasi)

        if let results: NSArray = araclarDatasi as? NSArray {
            results.forEach { veri in
                let araclarModeli = AllProvidersCar(JSON: veri as! [String : Any])

                araclarModeli?.araclar.forEach { arac in
                    let arac = JSON(arac)
                    print(arac["ARACADI"])

                    test = "emre" /**/
                }
            }
        }
    })
})

print(test.count)

最佳答案

ApiClient.shared 不会让调用者在从网络检索数据时等待。它异步工作,因此在网络操作完成时将获取的数据传递给它的成功 block 。

因此,在 allProvidersCars 方法被调用时,您的程序将已经到达您打印 test 的行,因此它会在之前打印出来 你做 test = "emre"

对于这个具体示例,让执行保持等待的最简单方法是使用 DispatchSemaphore .您创建一个信号量,在 .allProvidersCars() 开始工作后立即在信号量上调用 .wait(),这样代码将等待您释放信号量。您将在 test 设置完成后发布它。

这是一个快速演示,展示了如何在您的代码中执行此操作:

(注意:永远不要卡住主线程,所以我会在后台队列中执行此操作。)

var test = ""

let queue = DispatchQueue.global(qos: .background)
queue.async {
  let semaphore = DispatchSemaphore(value: 1)

  ApiClient.shared.login(..., successBlock: { .. in  
    ApiClient.shared.allProvidersCars(..., successBlock:  { .. in
      ...
      if let results: NSArray = araclarDatasi as? NSArray {
        ...
        test = "emre"
      }
      semaphore.signal()
    }
  }
  semaphore.wait()
  print(test)
}

关于swift - 变量值为空。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732120/

相关文章:

swift - Swift 中非抛出函数的错误处理

ios - 调用云代码 Parse Swift

ios - 即使应用程序被终止,在 iOS 中实现定期位置更新

swift - NSView with NSBezierPath 在窗口调整大小后不更新

ios - 如何允许选择和取消选择多个 UICollectionViewCell?

ios - setContentOffset 从 ScrollView 的底部开始不起作用

swift - 在枚举中使用 int 作为 case

ios - 在 UIPageViewControllers 中预加载所有 UIViewControllers (Swift)

xcode - 从 Firebase 数据库中检索数据 : unrecognized selector sent to instance

arrays - swift :changing the content of an array gives me an error