似乎在我的iOS应用程序(我正在使用Swift用Xcode编写)中,按下按钮后运行的功能全部一次运行,而无需考虑它们之间的任何睡眠功能。
这里是一些背景:
为了在我的iPhone应用程序和Raspberry Pi之间建立一条通信线路,我使用json存储箱(https://jsonstorage.net/)。该应用程序的工作方式是,它更新在以上站点创建的json容器,并将电子邮件作为文本消息发送到Raspberry Pi(Raspberry Pi使用Adafruit FONA处理文本消息),这触发了Pi收集数据来自json容器。 json bin将被更新为一个字符串,该字符串告诉Pi怎么做。收到此字符串后,Pi会执行一些操作,并将信息添加到其他json容器中。然后,我在应用程序中访问此bin,并用它来更新某些变量。
这是函数运行的代码(按下按钮,这会推到新的视图控制器;这是该新VC的viewDidLoad()
函数):
override func viewDidLoad() {
super.viewDidLoad()
uploadJsonData(dataString:"varsData")
sendEmail(body:"app varsData")
sleep(15)
collectData()
}
从概念上讲,此代码应该有效。如果我有一个按钮,当用户按下该按钮时,它会运行uploadJsonData()
和sendEmail()
函数,那么用户将等待15秒(请注意,如果我将sleep(15)
作为第一个按钮,此按钮将不起作用),然后用户按下另一个运行collectData()
函数的按钮,然后代码将按预期工作,并且在按下第二个按钮后,变量将立即使用新数据进行更新。但是,上面的代码不是这种情况:而是使用第二个json容器更新之前的数据更新变量,并且第二个json容器本身直到所有功能至少15秒后才会更新无论睡眠功能有多长,都可以运行(这意味着睡眠不执行任何操作,并且一切都立即运行,或者至少与Internet的交互都同时发生)。有人对这是为什么/如何解决有想法吗?
答案 0 :(得分:-2)
嘿,您可以将dispatchQueue用于延迟目的,就像我在下面使用的那样,
override func viewDidLoad() {
super.viewDidLoad()
uploadJsonData(dataString:"varsData")
sendEmail(body:"app varsData")
DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
collectData()
}
}