我正在尝试跟踪用户在其中一个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”变量会重置为当前时间,无论出于何种原因:
我在我的iPhone上设置了一个计时器到3分钟并在3分钟标记处切换到另一个视图控制器,所以我可以看到发生了什么是“timeStamp”被重置为我正在调用的任何时间“viewWillDisappear ”。我在这里有点失落 - 谁能告诉我为什么会这样?
答案 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中的值。您可以在每个位置打印功能名称以及时间戳,以确保是否是这种情况。