2015-05-24 150 views
0

點擊「startButton」按鈕後,觸發計時器每隔5秒執行一次「myCalculation」。 問題:myCalculation方法的執行時間大約需要5-10s才能完成目標c NSTimer間隔時間設置

Q1.如何爲定時器設置合適的時間間隔? (我認爲設置時間間隔爲10s太長,如果retrieveAndUpdateNews花費5s完成,程序將獲得5s空閒)

在當前情況下,儘管myCalculation需要10s才能完成,但計時器將跳過執行retrieveAndUpdateNews並觸發retrieveAndUpdateNews 5秒後。

Q2.Are這是我的應用程序的一個潛在問題? 謝謝你的時間。

-(IBAction) startButton : (id)sender{ 
NSTimer * myTimer; 
timer = [NSTimer scheduledTimerWithTimeInterval:5 
     target:self 
     selector:@selector(retrieveAndUpdateNews) 
     userInfo:nil repeats:YES];         
}      

-(void)retrieveAndUpdateNews{ 
    //some calculation spend 5 - 10 sec. 
} 
+0

爲什麼使用定時器?你在做什麼需要5到10秒?每次計算完成後,你真的想要開始5秒嗎? – Wain

+0

非常抱歉我的錯字,「myCalculation」應該改爲「retrieveAndUpdateNews」。我的任務是讓用戶按「startButton」,然後程序將保持從Web服務器檢索數據並將數據更新爲前端標籤。完成取決於服務器的響應時間需要5-10s。 –

回答

1

這聽起來像你真正想要的是,當用戶按下按鈕啓動計時器然後在數據在服務器上處理並下載時停止它,然後在收到數據後重新啓動它,以便可以再次刷新。喜歡的東西:

- (IBAction) startButton:(id)sender { 
    [self beginDownloadCycle]; 
} 

- (void)beginDownloadCycle { 
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:5 
     target:self 
     selector:@selector(retrieveAndUpdateNews) 
     userInfo:nil 
     repeats:NO]; 
}      

- (void)retrieveAndUpdateNews { 
    // some calculation spend 5 - 10 sec with completion block. 
    [... :^() { 
     [self beginDownloadCycle]; 
    }]; 
} 

注意:計時器應予以保留,使您可以根據需要取消它,讓你知道發生了什麼事情(因此self.myTimer =)。

+1

ARC破壞'myTimer'實例時會發生什麼? – Droppy

+1

@Droppy很好的問題,runloop保留計時器,但它是一個好主意,保持對計時器的引用,以便您可以更新,如果需要,所以我已經做了編輯 – Wain

+0

我有你的想法,非常感謝! –

0

它可能不是正確的方法來猜測你的計算需要多少時間(尤其是因爲它會在不同的設備上有所不同)。你爲什麼不利用gcd,並在計算完成後準確接收「回調」?

下面是它可能看起來像(假設你想在後臺線程執行你的計算):

- (IBAction)startButton:(id)sender { 

    [self doSomethingWithCompletionCallback:^{ 
     [self retrieveAndUpdateNews]; 
    }]; 
} 

- (void)doSomethingWithCompletionCallback:(void (^)(void))callback { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    /// do some work 
     callback(); 
    }); 
} 
+0

嗨Dariaa,謝謝你的評論。因爲我需要在用戶按下開始按鈕後不斷執行「retrieveAndUpdateNews」。我對GCD還不熟悉,你的意思是我需要在我的任務中將定時器添加到GCD中嗎?謝謝。 –

0

爲了避免這個問題,你可以使用

- (void)performSelector:(SEL)aSelector 
     withObject:(id)anArgument 
     afterDelay:(NSTimeInterval)delay 
裏面你的「retrieveAndUpdateNews」

也稱再次使用performSelector方法。所以這是一個遞歸調用。要取消執行選擇器,請使用

- (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget