私はこれが本当に単純であるとかなり確信しています、そして私はただ明白な何かを逃しています。UITableViewに表示するためにWebサービスからデータをダウンロードする必要があるアプリがあり、操作の完了にX秒以上かかる場合はUIAlertViewを表示したいと思います。だからこれは私が持っているものです(簡潔にするために簡略化されています):
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]