如何检测 30 秒持续时间
How to detect 30 seconds duration
我这里有一个案例研究。其中我有一个名为
的函数
loadData(action:String)
on viewDidLoad 我将此函数称为 loadData("sync") 现在我想将此函数调用为 loadData("load") 如果它的调用间隔在 30 秒之间。假设我想用 "sync" 调用这个函数,如果已经过了 30 秒,如果没有,那么 "load"
请指导我。
首先,您使用参数“sync”调用函数,然后选择两个选项之一(取决于您的 Swift 版本 - 您是否下载了开发者测试版 - 如果没有,则使用 Swift 2 option) below 在 30 秒后使用参数“load”调用 loadData。
如果您使用的是 Swift 3 选项,请将 className 替换为您的函数所在的任何 class - 很可能是 ViewController 或您的 UI 名称 ViewController.
Swift 3
var timer = Timer.scheduledTimer(timeInterval: 30.0, target: self, selector: #selector(className.loadData(action:)), userInfo: "load", repeats: false)
Swift 2
var timer = NSTimer.scheduledTimerWithTimeInterval(30.0, target: self, selector: "loadDataLater:", userInfo: "load", repeats: false)
//Then you have to define a new function as below
func loadDataLater(inputTimer: NSTimer) {
var action = inputTimer.userInfo as String
//The body of the loadData function goes here
}
如果您还有任何疑问或问题,请随时告诉我:)
创建实例变量var lastSync = NSDate()
使用同步操作时将当前日期设置为 lastSync
func loadData(action:String)
{
if action == "sync"
{
lastSync = NSDate()
}
}
打电话给您的 loadData:
检查时间间隔
let timeInsterval = NSDate().timeIntervalSinceDate(lastSync)
let reqAction = timeInsterval > 30 ? "sync" : "load"
然后通过将 reqAction
作为参数传递来调用您的方法
loadData(reqAction)
有一种解决方案是使用NSTimer
来计算秒数。当您第一次调用 loadData("sync")
方法时启动计时器。并增加第二个。当你不得不调用这个函数时,检查计算出的秒数,如果大于 30,则调用 sync
,否则调用 load
。看下面的代码。
var timer : NSTimer!
var second = 0
override func viewDidLoad() {
super.viewDidLoad()
// here you start your first sync method.
loadData("sync")
// start the timer here so you can get how many seconds before you started or called your method.
timer = NSTimer()
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ViewController.calculateSeconds), userInfo: nil, repeats: true)
}
func calculateSeconds() {
second += 1
}
现在,当您必须调用 loadData
方法时,请检查第二个变量,如果它大于 30,则调用 sync
,否则 load
。 invalidate
那个定时器将停止监视或计算秒。
像这样。
func whatever() {
if second > 30 {
loadData("sync")
} else {
loadData("load")
}
second = 0
timer.invalidate()
timer = nil
}
我这里有一个案例研究。其中我有一个名为
的函数loadData(action:String)
on viewDidLoad 我将此函数称为 loadData("sync") 现在我想将此函数调用为 loadData("load") 如果它的调用间隔在 30 秒之间。假设我想用 "sync" 调用这个函数,如果已经过了 30 秒,如果没有,那么 "load"
请指导我。
首先,您使用参数“sync”调用函数,然后选择两个选项之一(取决于您的 Swift 版本 - 您是否下载了开发者测试版 - 如果没有,则使用 Swift 2 option) below 在 30 秒后使用参数“load”调用 loadData。 如果您使用的是 Swift 3 选项,请将 className 替换为您的函数所在的任何 class - 很可能是 ViewController 或您的 UI 名称 ViewController.
Swift 3
var timer = Timer.scheduledTimer(timeInterval: 30.0, target: self, selector: #selector(className.loadData(action:)), userInfo: "load", repeats: false)
Swift 2
var timer = NSTimer.scheduledTimerWithTimeInterval(30.0, target: self, selector: "loadDataLater:", userInfo: "load", repeats: false)
//Then you have to define a new function as below
func loadDataLater(inputTimer: NSTimer) {
var action = inputTimer.userInfo as String
//The body of the loadData function goes here
}
如果您还有任何疑问或问题,请随时告诉我:)
创建实例变量var lastSync = NSDate()
使用同步操作时将当前日期设置为 lastSync
func loadData(action:String)
{
if action == "sync"
{
lastSync = NSDate()
}
}
打电话给您的 loadData:
检查时间间隔
let timeInsterval = NSDate().timeIntervalSinceDate(lastSync)
let reqAction = timeInsterval > 30 ? "sync" : "load"
然后通过将 reqAction
作为参数传递来调用您的方法
loadData(reqAction)
有一种解决方案是使用NSTimer
来计算秒数。当您第一次调用 loadData("sync")
方法时启动计时器。并增加第二个。当你不得不调用这个函数时,检查计算出的秒数,如果大于 30,则调用 sync
,否则调用 load
。看下面的代码。
var timer : NSTimer!
var second = 0
override func viewDidLoad() {
super.viewDidLoad()
// here you start your first sync method.
loadData("sync")
// start the timer here so you can get how many seconds before you started or called your method.
timer = NSTimer()
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ViewController.calculateSeconds), userInfo: nil, repeats: true)
}
func calculateSeconds() {
second += 1
}
现在,当您必须调用 loadData
方法时,请检查第二个变量,如果它大于 30,则调用 sync
,否则 load
。 invalidate
那个定时器将停止监视或计算秒。
像这样。
func whatever() {
if second > 30 {
loadData("sync")
} else {
loadData("load")
}
second = 0
timer.invalidate()
timer = nil
}