// // ReconnectTimer.m // MQTTClient // // Created by Josip Cavar on 22/08/2017. // Copyright © 2017 Christoph Krey. All rights reserved. // #import "ReconnectTimer.h" #import "GCDTimer.h" @interface ReconnectTimer() @property (strong, nonatomic) GCDTimer *timer; @property (assign, nonatomic) NSTimeInterval retryInterval; @property (assign, nonatomic) NSTimeInterval currentRetryInterval; @property (assign, nonatomic) NSTimeInterval maxRetryInterval; @property (strong, nonatomic) dispatch_queue_t queue; @property (copy, nonatomic) void (^reconnectBlock)(void); @end @implementation ReconnectTimer - (instancetype)initWithRetryInterval:(NSTimeInterval)retryInterval maxRetryInterval:(NSTimeInterval)maxRetryInterval queue:(dispatch_queue_t)queue reconnectBlock:(void (^)(void))block { self = [super init]; if (self) { self.retryInterval = retryInterval; self.currentRetryInterval = retryInterval; self.maxRetryInterval = maxRetryInterval; self.reconnectBlock = block; self.queue = queue; } return self; } - (void)schedule { __weak typeof(self) weakSelf = self; self.timer = [GCDTimer scheduledTimerWithTimeInterval:self.currentRetryInterval repeats:NO queue:self.queue block:^{ [weakSelf reconnect]; }]; } - (void)stop { [self.timer invalidate]; self.timer = nil; } - (void)resetRetryInterval { self.currentRetryInterval = self.retryInterval; } - (void)reconnect { [self stop]; if (self.currentRetryInterval < self.maxRetryInterval) { self.currentRetryInterval *= 2; } self.reconnectBlock(); } @end