Using GCD solved my problem. I wrapped the body of doStartMessageRefresh() in dispatch_async(dispatch_get_main_queue(), ^{...}); and NSTimer is now running and calling doInvokerForDoStartMessageRefresh() every N sec.
For whatever reason, this code works:
- (void) doInvokerForDoStartMessageRefresh:(NSTimer *) theTimer
{
NSLog(@"%s", __FUNCTION__);
NSLog(@"%@", [self.messageRefreshTimer fireDate]);
NSLog(@"%@", [theTimer fireDate]);
}
- (void) doStartMessageRefresh {
NSLog(@"%s", __FUNCTION__);
dispatch_async(dispatch_get_main_queue(), ^{
self.messageRefreshTimer = [NSTimer scheduledTimerWithTimeInterval:MESSAGE_REFRESH_INTERVAL_SECONDS
target:self
selector:@selector(doInvokerForDoStartMessageRefresh:)
userInfo:nil
repeats:YES];
});
}
I'd still like to know why GCD was required here.