我很确定这真的很简单,我只是遗漏了一些明显的东西。我有一个应用程序需要从 Web 服务下载数据以显示在 UITableView 中,如果操作需要超过 X 秒才能完成,我想显示 UIAlertView。所以这就是我所得到的(为简洁起见):
MyViewController.h
@interface MyViewController : UIViewController
<UITableViewDelegate, UITableViewDataSource> {
NSTimer *timer;
}
@property (nonatomic, retain) NSTimer *timer;
我的视图控制器.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]
,它确实如此。