Как мне вызвать задержку, скажем, я хочу вызвать метод (один раз) через 3 секунды, и как мне отменить этот вызов, если мне нужно?
Отложенный вызов с возможностью отмены?
Ответы (3)
Вы также можете использовать -[NSObject performSelector:awithObject:afterDelay:]
и +[NSObject cancelPreviousPerformRequestsWithTarget:selector:object]
.
person
Ben Gottlieb
schedule
03.12.2008
+cancelPreviousPerformRequestsWithTarget:selector:object: метод класса (+), а не метод экземпляра (-). Вот почему он принимает цель (экземпляр) в качестве одного из своих аргументов.
- person Peter Hosey; 03.12.2008
Это намного проще в использовании, чем NSTimer. Или я что-то упускаю?
- person Steph Thirion; 03.12.2008
Это намного проще, но и менее гибко.
- person Jens Ayton; 04.12.2008
Используйте NSTimer. Используйте это, чтобы настроить вызов method за три секунды. Он будет вызван только один раз:
[NSTimer scheduledTimerWithTimeInterval: 3
target: self
selector: @selector(method:)
userInfo: nil
repeats: NO];
метод должен выглядеть следующим образом:
- (void) method: (NSTimer*) theTimer;
Вы можете передавать параметры в метод, используя userInfo (в приведенном выше примере установите значение nil). Доступ к нему можно получить в методе как [theTimer userInfo].
Используйте метод invalidate в NSTimer, чтобы отменить его.
person
Stephen Darlington
schedule
03.12.2008
Должен ли метод выглядеть так? И нужно ли что-то делать с переданным экземпляром NSTimer?
- person Steph Thirion; 03.12.2008
Думаю, я прав, говоря, что метод должен выглядеть именно так. Параметр userInfo используется для передачи дополнительных данных. Это доступ как [theTimer userInfo] в вашем методе.
- person Stephen Darlington; 03.12.2008
в шапке..
NSTimer *timer;
когда вы хотите настроить ..
timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(yourMethod:) userInfo:nil repeats:NO];
когда вы хотите отменить ..
[timer invalidate];
person
adam
schedule
03.12.2008
Не забудьте сохранить таймер, когда вы его настроите, и отпустите его после того, как вы сделаете его недействительным. Полагаться на цикл выполнения, чтобы сохранить его для вас, — плохой тон и риск поломки, если Apple когда-либо изменит реализацию.
- person Peter Hosey; 03.12.2008