如何检测30秒的持续时间

时间:2016-08-09 09:46:56

标签: ios swift nstimer nstimeinterval

我在这里有一个案例研究。其中我有一个名为

的函数
loadData(action:String)

on viewDidLoad我将此函数称为loadData(“sync”)现在我想将此函数调用为loadData(“load”),如果其调用间隔介于30秒之间。假设我想在30秒后通过“同步”调用此函数,如果没有,则“加载”

请指导我。

3 个答案:

答案 0 :(得分:5)

使用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
}

答案 1 :(得分:1)

首先用参数“sync”调用你的函数,然后把两个选项(取决于你的Swift版本 - 你下载了开发者测试版 - 如果没有,那么使用Swift 2选项)来调用loadData 30秒后使用参数“load”。 如果您正在使用Swift 3选项,请将className替换为您的函数所在的类 - 很可能是ViewController或UIViewController的名称。

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
}

如果您有任何其他问题或疑问,请随时告诉我们。)

答案 2 :(得分:1)

创建实例变量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)