静态NSDate变量在函数调用

时间:2016-07-20 17:36:29

标签: ios swift static nsdate

我正在尝试跟踪用户在其中一个ViewControllers中花费的时间。我这样做是首先创建一个带有静态NSDate变量的TimeManager结构,如下所示:

struct TimeManager {
    static var timeStamp: NSDate!
    static let globalManager = TimeManager()

    func setSessionDuration(startupTime: NSDate, controller: String) {
        let timeInterval = ( (startupTime.timeIntervalSinceNow) * -1)
        LocalUser.user.timePerController[controller]! += timeInterval
    }  
}

然后,在我的ViewController的“viewDidLoad”方法中,我将我的TimeManager的“timeStamp”变量设置为新初始化的NSDate():

override func viewDidLoad() {
    super.viewDidLoad()
    LocalUser.user.mostRecentAction = "Browsed Item Feed."
    TimeManager.timeStamp = NSDate()
    print("\(TimeManager.timeStamp)")
    ...

最后,在“viewWillDisappear”中,我调用了我的“setSessionDuration”函数,并将加载视图时设置的“timeStamp”传递给它:

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    print("\(TimeManager.timeStamp)")
    TimeManager.globalManager.setSessionDuration(TimeManager.timeStamp, controller: "BrowseViewController")
    ...

然而,通过print语句,我发现当我将它传递给函数时,“timeStamp”变量会重置为当前时间,无论出于何种原因:

enter image description here

我在我的iPhone上设置了一个计时器到3分钟并在3分钟标记处切换到另一个视图控制器,所以我可以看到发生了什么是“timeStamp”被重置为我正在调用的任何时间“viewWillDisappear ”。我在这里有点失落 - 谁能告诉我为什么会这样?

2 个答案:

答案 0 :(得分:0)

尝试在函数inout startupTime Argument:

中使用setSessionDuration
 func setSessionDuration(inout startupTime: NSDate, controller: String) {
    let timeInterval = ( (startupTime.timeIntervalSinceNow) * -1)
    LocalUser.user.timePerController[controller]! += timeInterval
}

并在viewWillDisappear中将TimeManager.timeStamp更改为&TimeManager.timeStamp以通过引用传递:

TimeManager.globalManager.setSessionDuration(&TimeManager.timeStamp, controller: "BrowseViewController")

答案 1 :(得分:0)

您是否也可以在代码中的其他位置设置TimeManager.timeStamp = NSDate()?

另一个可能的原因可能是您正在对相同的视图控制器执行segue(而不是关闭它),并且您看到的值是第二个实例的viewDidLoad中的值。您可以在每个位置打印功能名称以及时间戳,以确保是否是这种情况。