Я почти уверен, что это действительно просто, и я просто упускаю что-то очевидное. У меня есть приложение, которое нуждается в загрузке данных из веб-службы для отображения в UITableView, и я хочу отобразить UIAlertView, если операция занимает более X секунд. Вот что я получил (для краткости упрощенно):
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]
, он делает.