之前在項目中用了網上封裝好的輪播圖,數據是從服務器取回來,之前一直沒問題,直到今天,測試的時候加了一張輪播圖,程序就馬上崩潰了,然後開始找原因,一開始我懷疑是輪播那個控件的問題,便自己換了一個,後面才發現,結果還是一樣崩掉了,後面我在輪播圖切換的時候打印一些數據出來,後面才發現,從服務器取得新的數據之後,將原本的view設置爲nil,但是,控制檯還是在不斷的打印,自己研究了很久還是不知道哪裏的問題,跑去問了同事,同事直接問是不是開了線程了,一句話,我猛的想起,輪播圖裏面加了Timer來控制圖片的切換,好吧,問題終於找到了。
我們可以這樣來使用一個Timer
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(function:) userInfo:nil repeats:NO];
//這是一個執行一次,不重複的Timer
不過大多數情況下,我們需要的Timer都是需要不斷執行d
下面是輪播控件裏面Timer的一個擴展:
@implementation NSTimer (Addition)
-(void)pauseTimer
{
if (![self isValid]) {
return ;
}
[self setFireDate:[NSDate distantFuture]];
}
-(void)resumeTimer
{
if (![self isValid]) {
return ;
}
[self setFireDate:[NSDate date]];
}
- (void)resumeTimerAfterTimeInterval:(NSTimeInterval)interval
{
if (![self isValid]) {
return ;
}
[self setFireDate:[NSDate dateWithTimeIntervalSinceNow:interval]];
}
@end
setFireDate:[NSDate distantFuture],可以讓Timer暫時的休眠,睡一下吧,年輕人.
setFireDate:[NsDate date],這個可以讓Timer重新煥發活力,重新開始運行
最後一個是在延遲多長時間後重新運行.
有時我們在界面切換到別的地方時候,我們需要在輪播圖停止切換,實際就是讓Timer休眠一下,我們可以這麼做:
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[_mBannerScrollView resumeTimer];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[_mBannerScrollView pauseTimer];
}
在界面不可見的時候,讓Timer停止,界面可見的時候,Timer恢復正常運行.
最後,是Timer的釋放問題。
[timer invalidate];
timer = nil;
可以這樣將一個Timer釋放,防止出現我的view設置爲nil後Timer還在不斷的運行。