У меня есть код, который получает разницу между сегодняшней и другой строкой времени.Обратный отсчет NSTimer, производящий 0 дважды
Дисплей обновляется каждую секунду, используя NSTimer.scheduledTimerWithTimeInterval
.
Все работает нормально, за исключением случаев, когда таймер достигает 0. 0
отображается дважды.
Пример:
3,2,1,0,0,-1,-2
Ниже мой код сделано сделано в детской площадке:
//: 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
}
Спасибо! Даже, хотя я не понял вашего объяснения ясно (им новичок в быстром) Это объясняло мне много. Еще одна вещь: что вы имеете в виду закругленные времена Unix? – Led
после прочтения вашего объяснения полностью, я получил его. Благодаря! – Led
Добро пожаловать. Округленное время unix означает время в формате unix, которое поставляется с округленным значением snapped unix time, очищенным от беспорядочной десятичной части, что может привести к ошибке при подсчете. Например. округление 1,459 будет 1, 1,668 => 2 и т. д. Возможно, если компонент календаря переводит время, у которого есть часть .2873 ... в нем он считается целым вторым. Таким образом, округляя его, мы избавляемся от этой возможной ошибки. – pedrouan