2016-08-31 11 views
2

У меня есть код, который получает разницу между сегодняшней и другой строкой времени.Обратный отсчет NSTimer, производящий 0 дважды

Дисплей обновляется каждую секунду, используя NSTimer.scheduledTimerWithTimeInterval.

Все работает нормально, за исключением случаев, когда таймер достигает 0. 0 отображается дважды.

Пример:

3,2,1,0,0,-1,-2 

enter image description here

Ниже мой код сделано сделано в детской площадке:

//: Playground - Time Countdown 
import UIKit 
import XCPlayground 
XCPSetExecutionShouldContinueIndefinitely() 

class MyClass { 

    var totalSecondsText = "" 

    init(classSecondsText: String){ 
     totalSecondsText = classSecondsText 
    } 

    @objc func ontimer(timer:NSTimer!){ 

     let total = determineTimeDifference(totalSecondsText) 

       let (hour,min,sec) = secondsConverter(total) 

       if hour >= 1 { 
        if min >= 1 { 
         NSLog(String(hour)+"h "+String(min)+"m") 
        }else { 
         NSLog(String(hour)+"h") 
        } 
       }else{ 
        if min >= 1{ 
         NSLog(String(min)+"m "+String(sec)+"s") 
        } else if min > -1 { 
         NSLog(String(sec)+"s") 
        } else if min <= -1 { 
         NSLog(String(min)+"m") 
        } 
       } 
    } 

    func determineTimeDifference(timeInputed: String) -> Int { 

     let dateFormat = NSDateFormatter() 
     dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
     let finalDate = dateFormat.dateFromString(raceTime) 
     let differenceTimeInSeconds = (finalDate?.timeIntervalSinceNow)! 

    return differenceInSeconds 

    } 

    func secondsConverter (seconds : Int) -> (Int , Int, Int){ 
     return (seconds/3600, (seconds % 3600)/60, (seconds % 3600) % 60) 
    } 

} 

// Add +1 minute on time to test. 
var dateString = "2016-08-31T6:49:00Z" 

NSTimer.scheduledTimerWithTimeInterval(1, target: MyClass(classSecondsText: dateString), selector: #selector(MyClass.ontimer(_:)), userInfo: nil, repeats: true) 

Любая идея о том, что пошло не так?

Update:

Как и было обещано, вот ошибка исправления этой проблемы:

func determineTimeDifference(timeInputed: String) -> Int { 

      let dateFormat = NSDateFormatter() 
      dateFormat.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 
      let finalDate = dateFormat.dateFromString(raceTime)?.timeIntervalSince1970 
      let dateNow = NSDate().timeIntervalSince1970 
      let differenceTimeInSeconds = Int(finalDate) - Int(dateNow) 

    return differenceInSeconds 
} 

ответ

1

Ваш код хорошо обеспечен, и условия правильно установлены. Похоже, что Data.components не корректно обрабатывает разницу. Это может быть вызвано округлением секундного компонента.

Если подсчет до того момента, когда текущее время и последний раз равны, (достигает 0,0), результат приходит с ошибкой -1.

Когда я обновил свой код с дополнительными гравюрами, это было показано:

CURRENT date: 2016-08-31 13:10:57 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 2s (BAD) 
CURRENT unix: 1472649057.28685 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: -3.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
2s 

CURRENT date: 2016-08-31 13:10:58 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 1s (BAD) 
CURRENT unix: 1472649058.28734 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: -2.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
1s 

CURRENT date: 2016-08-31 13:10:59 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 0s (BAD) 
CURRENT unix: 1472649059.28731 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: -1.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
0s 

CURRENT date: 2016-08-31 13:11:00 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: 0s (OK) 
CURRENT unix: 1472649060.28731 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: 0.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
0s 

CURRENT date: 2016-08-31 13:11:01 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: -1s (OK) 
CURRENT unix: 1472649061.28731 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: 1.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
-1s 

CURRENT date: 2016-08-31 13:11:02 +0000 - FINAL date: 2016-08-31 13:11:00 +0000 
-->> diff by DateComponents: -2s (OK) 
CURRENT unix: 1472649062.28729 - FINAL unix: 1472649060.0 
--->>> Diff in UNIX: 2.0s (counted as Rounded CURRENT UNIX - FINAL UNIX) 
-2s 

Таким образом, если используются подсчет по разнице между закругленным разом UniX, результатами являются правильными.

Заключение: ошибка иногда возникает перед уравнением, иногда приходит после этого. Это зависит от того, в какое время был запущен этот скрипт. Если подсчет по компонентам данных начинается с ошибки, он очищается после 0, 0. Если подсчет начинается с правильного результата, результаты начинают приводить к ошибкам. Вот почему ноль появляется дважды - в тот момент, когда результат меняет свой точный статус.

+0

Спасибо! Даже, хотя я не понял вашего объяснения ясно (им новичок в быстром) Это объясняло мне много. Еще одна вещь: что вы имеете в виду закругленные времена Unix? – Led

+0

после прочтения вашего объяснения полностью, я получил его. Благодаря! – Led

+0

Добро пожаловать. Округленное время unix означает время в формате unix, которое поставляется с округленным значением snapped unix time, очищенным от беспорядочной десятичной части, что может привести к ошибке при подсчете. Например. округление 1,459 будет 1, 1,668 => 2 и т. д. Возможно, если компонент календаря переводит время, у которого есть часть .2873 ... в нем он считается целым вторым. Таким образом, округляя его, мы избавляемся от этой возможной ошибки. – pedrouan