与时间有关的计算

时间:2017-09-17 12:22:13

标签: swift nsdateformatter swift4 dateformatter

我正在使用Swift 4编写应用程序。此应用程序首先获取当前设备时间并将其放入currentTimeLabel格式的标签(HH:mm)中。

它还在一个与firebase数据库不同的时区中获取时间作为字符串,并将其放在两个标签(currentSharedTimeLabeltimeReceivedFromServerLabel)中,格式为HH:mm。从服务器检索的数据还包括秒。显然,这第二次没有改变 - 但我希望它的行为就像用户期望的那样,即我希望每秒钟向服务器添加一秒钟。

为实现此目的,我首先使用以下代码将共享时间从字符串更改为格式化时间:

let isoDate = timeReceivedFromServerLabel.text
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
let mathDate = dateFormatter.date(from: isoDate!)

然后我想运行一个函数,它每秒向mathDate添加一秒,并将结果放在currentSharedTimeLabel中。你能告诉我如何实现这个目标吗?

此刻,它完全没有用,我正在做:

for i in 0..<1314000 {
    let j = i + 1
    print(i, j)

    let newCalcTime = mathDate?.addingTimeInterval(TimeInterval(j))
    currentSharedTimeLabel.text = ("\(newCalcTime)")
    print("\(String(describing: newCalcTime))")

我在这方面有点失去理智,我将不胜感激。

(我希望我已经明确了我的问题,不要因缺乏或肤浅的信息而烦恼你。)

编辑2: 数据库观察员代码(更新Cocoapods后)

// SUBMIT BUTTON
    let submitAction = UIAlertAction(title: "Submit", style: .default, handler: { (action) -> Void in
        let textField = alert.textFields![0]
        self.enterSharingcodeTextfield.text = textField.text

        // SEARCHES FOR SHARING CODE IN DATABASE (ONLINE)
        let parentRef = Database.database().reference().child("userInfoWritten")

        parentRef.queryOrdered(byChild: "sharingcode").queryEqual(toValue: textField.text).observeSingleEvent(of: .value, with: { snapshot in

            print(snapshot)

            // PROCESSES VALUES RECEIVED FROM SERVER
            if ( snapshot.value is NSNull ) {

                // DATA WAS NOT FOUND
                // SHOW MESSAGE LABEL
                self.invalidSharingcodeLabel.alpha = 1

            } else {

                // DATA WAS FOUND
                for user_child in (snapshot.children) {

1 个答案:

答案 0 :(得分:1)

我认为这听起来像Timer的一个很好的用例。

假设您将当前时间转换为存储在currentTimeInSeconds变量中的秒数。

每次出现视图控制器时,您都可以更新其值,然后使用计时器在本地更新其值,直到用户离开视图控制器,这会给用户留下一个印象,即它的工作方式类似于&#34;实际&#34;时钟。

因此,您的计时器定义在班级范围内的顶部:

var timer = Timer()

您可以在viewDidAppear中初始化计时器,如下所示:

timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)

每秒都会调用updateTimer()方法:

func updateTimer() {
    currentTimeInSeconds += 1
}

您唯一需要做的就是将currentTimeInSeconds转换为hh:mm:ss中的时间,您应该好好去!

或者您也可以使用Date addTimeInterval()方法在Date方法中将updateTimer()直接递增一秒,具体取决于何时( if)您想要将Firebase数据库中的NSNumber转换为Date

当用户离开视图控制器(viewDidDisappear)时,也不要忘记使计时器无效:

timer.invalidate()