【问题标题】:How to pause between functions in Xcode?如何在 Xcode 中的函数之间暂停?
【发布时间】: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。您是否考虑过使用Timerdispatch 函数?看看这个帖子,它可以给你一些想法:stackoverflow.com/a/32696605/5464805
  • 非常感谢。我是 Swift 的新手,永远也想不通。该链接的第一个答案——调度函数——解决了我的问题(所以我想这个问题是重复的,尽管我找不到那个问题)。非常感谢您的帮助!
  • @DOM 不,您不想使用asyncAfter。这远不是这个问题的正确解决方案。
  • 不客气。实际上,这只解决了您的具体问题:您不应该设置固定时间来等待服务器更新。事实是,您无法确切知道数据何时会在微控制器端更新。您应该使用Timer,它将每 X 秒运行一次函数,并且可以检测树莓上何时有可用数据。
  • 这个问题的整个前提是有缺陷的,因为“睡觉”根本不是正确的方法。您正在处理多个异步进程。有一些适当的方法可以使用这些功能,但“等待”(尤其是固定的时间)不是其中之一。

标签: ios swift xcode sleep


【解决方案1】:

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

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

【讨论】:

  • 不,不要这样做。使用完成处理程序并正确处理异步操作。
  • 以上代码有什么问题?是否有任何原因会影响应用性能?
  • 问题是15秒是完全任意的。您无法确定是否会在 15 秒内收到您的电子邮件。它可能需要更少的时间(因此它不是最佳的)或更长的时间(collectData 函数将失败)。你应该“倾听”你的树莓派,例如使用定时器,并在你 100% 确定已收到电子邮件时触发collectData。然而@rmaddy 这解决了最初的“问题”,即使它不是你应该在实际代码中看到的东西
  • @Olympiloutre 抱歉,但我不同意这解决了最初的问题。它在某些条件下似乎可以工作,但这并不能使其成为问题的正确解决方案。
  • @Olympiloutre 我肯定会使用完成处理程序来调用上传数据和发送电子邮件。然后可能需要某种轮询来检测 Raspberry Pi 何时更新数据。一旦检测到数据,就可以收集数据。
猜你喜欢
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2014-07-08
  • 2019-01-18
  • 2016-07-09
  • 2014-02-12
相关资源
最近更新 更多