Timer
Timer
let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: true)
@objc func fireTimer() {
print("Timer fired!")
}
Using DispatchQueue
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
print("Timer fired!")
}
Hacking with Swift Timer Ultimate guide
RxTimer
Using timer to continuously check for certain condition - that could be the access token or refresh token expiring on app launch to present the login screen or logout the user for security purposes.
We can achieve that using a timer
option in Rx world.
Method Signature
.timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)
Observable<Int>
.timer(initialTimerInterval,
period: refreshTokenInterval,
scheduler: MainScheduler.asyncInstance)
.filter { _ in filterVariable }
.mapToVoid()
.map { object }
.bind(to: subject)
.disposed(by: bag)
static let initialTimerInterval: RxTimeInterval = .milliseconds(400)
static let refreshTokenInterval: RxTimeInterval = .seconds(5)
Previous implementation had
.interval(.seconds(Constant.refreshTokenInterval),
scheduler: MainScheduler.instance)
One of the main reasons to switch to timer from Interval would be start with timer option.
As stated by my teammate in an excellent MR change-set comment
1. it makes it clear that we're using a timer to drive the logic here rather than a more vague `interval`
2. this method allows us to configure a timer with an initial event (the `dueTime` argument). this allows us to check for refresh token expiration at the start of the timer and then at regular time intervals after that (the `period` argument). without this, or if we continued using `Observable.interval`, we should need to introduce a `.startWith(0)` to this sequence to have it check for expiration when this sequence is created
Note: unfortunately we can't pass `.seconds(0)` as the `dueTime` as this prevents an initial element from being emitted and the use of `.startWith(0)` would again be required. so i just sent a sufficiently small time interval of 400 milliseconds
Which also states the .startWith()
observable chain being ready for observing so to get around that we start with .milliseconds(400)