NSTimer每分钟运行一次但是在第一秒运行

Web*_*ode 2 objective-c ios swift

我有NSTimer的经验,每分钟运行一次,比如

NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("everyMinute"), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)

是否可以使用NSTimer,其他一些类或其他控件,每分钟运行一些方法但是在第一分钟?

我确实知道如何自己实现它,但我首先检查这已经存在了吗?

Fab*_*ato 8

一种方法是使用NSCalendar计算当前的下一分钟,并安排计时器从那里开始,在runLoop上手动调度

let date = NSDate()
let calendar = NSCalendar.currentCalendar()
let components = calendar.components(NSCalendarUnit.CalendarUnitEra|NSCalendarUnit.CalendarUnitYear|NSCalendarUnit.CalendarUnitMonth|NSCalendarUnit.CalendarUnitDay|NSCalendarUnit.CalendarUnitHour|NSCalendarUnit.CalendarUnitMinute, fromDate: date)
components.minute += 1
components.second = 1
let nextMinuteDate = calendar.dateFromComponents(components)
let timer = NSTimer(fireDate: nextMinuteDate!, interval: 60, target: self, selector: Selector("everyMinute"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSDefaultRunLoopMode)
Run Code Online (Sandbox Code Playgroud)


Lea*_* ES 5

接受的答案,针对 Swift 5 进行了更新:

let date = Date()
let calendar = Calendar.current
var components = calendar.dateComponents([.era, .year, .month, .day, .hour, .minute], from: date)

guard let minute = components.minute else { return }
components.second = 0
components.minute = minute + 1

guard let nextMinute = calendar.date(from: components) else { return }

let timer = Timer(fire: nextMinute, interval: 60, repeats: true) { [weak self] timer in
    self?.everyMinute()
}
RunLoop.main.add(timer, forMode: .default)
Run Code Online (Sandbox Code Playgroud)