【发布时间】:2019-10-18 14:30:29
【问题描述】:
似乎在我的 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 并使用它来更新某些变量。
这是函数运行的代码(按下按钮,将推送到新的视图控制器;这是新 VC 的 viewDidLoad() 函数):
override func viewDidLoad() {
super.viewDidLoad()
uploadJsonData(dataString:"varsData")
sendEmail(body:"app varsData")
sleep(15)
collectData()
}
从概念上讲,这段代码应该工作。如果我有一个按钮,当用户按下它时,它会运行 uploadJsonData() 和 sendEmail() 函数,然后用户等待 15 秒(请注意,如果我有一个 sleep(15) 作为第一个按钮的一部分,这不会' t 工作),然后用户按下另一个运行 collectData() 函数的按钮,然后代码将按预期工作,并且在按下第二个按钮后立即使用新数据更新变量。但是,上面的代码并非如此:相反,变量会使用第二个 json bin 更新之前的数据进行更新,并且第二个 json bin 本身直到所有函数完成后至少 15 秒才会更新运行,无论睡眠功能的长度如何(暗示睡眠不做任何事情,一切都同时运行,或者至少与互联网的交互都同时发生)。有没有人知道这是为什么/如何解决它?
【问题讨论】:
-
首先你不应该在主线程上使用
sleep。您是否考虑过使用Timer或dispatch函数?看看这个帖子,它可以给你一些想法:stackoverflow.com/a/32696605/5464805 -
非常感谢。我是 Swift 的新手,永远也想不通。该链接的第一个答案——调度函数——解决了我的问题(所以我想这个问题是重复的,尽管我找不到那个问题)。非常感谢您的帮助!
-
@DOM 不,您不想使用
asyncAfter。这远不是这个问题的正确解决方案。 -
不客气。实际上,这只解决了您的具体问题:您不应该设置固定时间来等待服务器更新。事实是,您无法确切知道数据何时会在微控制器端更新。您应该使用
Timer,它将每 X 秒运行一次函数,并且可以检测树莓上何时有可用数据。 -
这个问题的整个前提是有缺陷的,因为“睡觉”根本不是正确的方法。您正在处理多个异步进程。有一些适当的方法可以使用这些功能,但“等待”(尤其是固定的时间)不是其中之一。