我是 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/