According to the NSTimer
documentation, it is not meant to be accurate.
Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds. If a timer’s firing time occurs during a long callout or while the run loop is in a mode that is not monitoring the timer, the timer does not fire until the next time the run loop checks the timer. Therefore, the actual time at which the timer fires potentially can be a significant period of time after the scheduled firing time.
You may want to use the dispatch_after
function from GCD, which is suggested by the official documentation for this exact purpose (creating a timer).
If you want to perform a block once after a specified time interval, you can use the
dispatch_after
ordispatch_after_f
function.
By the way, I agree with Caleb’s answer. You probably are going to solve your problems if you don’t accumulate error like your doing right now.
If you store the start date and recalculate the time at every iteration using the -timeIntervalSince:
method, you’re gonna end up with an accurate UI update, regardless of the timer precision.