ios應用切換到後臺再切換到前臺,倒計時時間不準確問題的解決方案

有兩種方案解決定時器前後臺切換,倒計時停止顯示不準確的問題。
1.準確及時方案:創建NSTimer定時器,監控前後臺通知和全局變量記錄時間。定時器開啓的頁面或組件監控進入後臺通知,收到通知記錄當前時間,當接收到進入前臺通知時計算當前時間和記錄的時間差,用倒計時的時間減去這個時間差就時剩下的時間,立即顯示這個倒計時時間。這樣及時準確。不能解決用戶修改系統時間這種非常規操作。當然可以通過監控應用進入後臺和服務器時間對時,算出這個時間差,再進行修正。這個完美方案需要後臺配合,僅僅依賴app時搞不定所有的。
2.切換到後臺存在延遲刷新的問題解決方案:起線程記錄時間。

-(void)startTime{
    int seconds = 1000;
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 100.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    
    NSDate *endTime = [NSDate dateWithTimeIntervalSinceNow:seconds];
    dispatch_source_set_event_handler(timer, ^{
        int interval = [endTime timeIntervalSinceNow];
        if (interval <= 0) {
            dispatch_source_cancel(timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"0");
            });
        } else {
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"%d", interval);
            });
        }
    });
    dispatch_resume(timer);
}
NSDate *endTime = [NSDate dateWithTimeIntervalSinceNow:seconds];

是記錄定時器開啓時的時間加上定時的時間(終止時間)。

 int interval = [endTime timeIntervalSinceNow];

是計算終止時間和現在的時間差,單位是:秒。
這個是定時間隔到了更新定時間隔。
當然這種方案存在一個顯著的問題。當應用切換到後臺,然後切換到前臺,這個定時器回調而是再0到1個定時間隔之內。若這個定時間隔很大,你在應用切換到前臺時顯示的是還是以前的時間,並且這個錯誤時間被更新需要比較長的時間。這個是它存在不及時的問題。
當然它的優點也和顯然:代碼和簡單,不需要接受通知和生命全局變量記錄時間,當定時間隔很小時,這種延遲很小。
當然它也不能單獨解決用戶修改系統時間的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章