ios - 如何在 Xcode 中的函数之间暂停?
问题描述
似乎在我的 iOS 应用程序(我用 Swift 用 Xcode 编写)中,在按下按钮后运行的函数全部同时运行,而不考虑它们之间的任何睡眠函数。
这里有一些背景:
为了在我的 iPhone 应用程序和我的 Raspberry Pi 之间创建一条通信线路,我使用了 json 存储箱 ( https://jsonstorage.net/ )。该应用程序的工作方式是更新在上述站点创建的 json bin,并将电子邮件作为文本消息发送到 Raspberry Pi(Raspberry Pi 使用 Adafruit FONA 来处理文本消息),这会触发 Pi 收集数据从 json 箱。json bin 将使用一个字符串更新,该字符串告诉 Pi 做什么。收到此字符串后,Pi 会执行一些操作并将信息添加到不同的 json bin。然后,我在我的应用程序中访问这个 bin 并使用它来更新某些变量。
这是函数运行的代码(按下一个按钮,它会推送到一个新的视图控制器;这是viewDidLoad()
那个新 VC 的函数):
override func viewDidLoad() {
super.viewDidLoad()
uploadJsonData(dataString:"varsData")
sendEmail(body:"app varsData")
sleep(15)
collectData()
}
从概念上讲,这段代码应该可以工作。如果我有一个按钮,当用户按下它时,它运行uploadJsonData()
andsendEmail()
功能,然后用户等待 15 秒(请注意,如果我有一个sleep(15)
作为第一个按钮的一部分,这将不起作用),然后用户按下另一个运行的按钮collectData()
函数,然后代码将按预期工作,并且在按下第二个按钮后立即使用新数据更新变量。但是,上面的代码并非如此:相反,变量会使用第二个 json bin 更新之前的数据进行更新,并且第二个 json bin 本身直到所有函数完成后至少 15 秒才会更新运行,无论睡眠功能的长度如何(暗示睡眠不做任何事情,并且一切都同时运行,或者至少与互联网的交互都同时发生)。有没有人知道为什么会这样/如何解决它?
解决方案
嘿,您可以使用 dispatchQueue 进行延迟,就像我在下面使用的那样,
override func viewDidLoad() {
super.viewDidLoad()
uploadJsonData(dataString:"varsData")
sendEmail(body:"app varsData")
DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
collectData()
}
}
推荐阅读
- c++ - Are empty methods in an abstract class/interface considered a good practice?
- typescript - 使用 HTML2CANVAS 的多个带有 jspdf 的页面?
- ios - 如何录制音频并将其保存到沙盒?
- python-3.x - How to fix Range function in Python?
- java - 在 Java 中向上转换“this”引用有什么意义吗?
- php - 我在将数据插入数据库时遇到问题,但没有显示任何错误
- r - dyplot.prophet 绘图函数中的标题和轴图例
- c# - .NET RegEx:查找函数并验证
- python - 在单元测试中比较字典时如何忽略某些值?
- c++ - QLineSeries::setUseOpenGL 无法正确处理特定数据