首页 > 解决方案 > 如何在 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 秒才会更新运行,无论睡眠功能的长度如何(暗示睡眠不做任何事情,并且一切都同时运行,或者至少与互联网的交互都同时发生)。有没有人知道为什么会这样/如何解决它?

标签: iosswiftxcodesleep

解决方案


嘿,您可以使用 dispatchQueue 进行延迟,就像我在下面使用的那样,

override func viewDidLoad() {
    super.viewDidLoad()
    uploadJsonData(dataString:"varsData")
    sendEmail(body:"app varsData")
    DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
       collectData()
    }  
}

推荐阅读