我敢肯定,這非常簡單,我只是缺少一些明顯的東西。我有一個應用程序需要從Web服務下載數據以顯示在UITableView中,如果操作需要超過X秒的時間才能完成,我想顯示一個UIAlertView。所以這是我有什麼(簡化爲簡潔起見):NSTimer作爲超時機制
MyViewController.h
@interface MyViewController : UIViewController
<UITableViewDelegate, UITableViewDataSource> {
NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;
MyViewController.m
@implementation MyViewController
@synthesize timer;
- (void)viewDidLoad {
timer = [NSTimer scheduledTimerWithTimeInterval:20
target:self
selector:@selector(initializationTimedOut:)
userInfo:nil
repeats:NO];
[self doSomethingThatTakesALongTime];
[timer invalidate];
}
- (void)doSomethingThatTakesALongTime {
sleep(30); // for testing only
// web service calls etc. go here
}
- (void)initializationTimedOut:(NSTimer *)theTimer {
// show the alert view
}
我的問題是,我期待[self doSomethingThatTakesALongTime]
調用阻止,而定時器不斷計數,我在想,如果它完成計時器完成倒計時之前,它將返回線程控制到viewDidLoad
其中[timer invalidate]
將繼續取消定時器。很顯然,我對定時器/線程如何工作的理解在這裏存在缺陷,因爲代碼編寫的方式,定時器永遠不會關閉。但是,如果我刪除了[timer invalidate]
,它會。
這工作得很好。我唯一需要做的就是在doSomethingThatTakesAlongTime中初始化一個NSAutoreleasePool。謝謝! – alexantd 2010-06-02 23:38:53
備註:當使計時器無效時,在使計時器無效並將計時器設置爲零之後,通常都會檢查計時器是否爲零。 – Groot 2013-04-17 11:40:42