Отложенный вызов с возможностью отмены?

Как мне вызвать задержку, скажем, я хочу вызвать метод (один раз) через 3 секунды, и как мне отменить этот вызов, если мне нужно?


person Steph Thirion    schedule 03.12.2008    source источник


Ответы (3)


Вы также можете использовать -[NSObject performSelector:awithObject:afterDelay:] и +[NSObject cancelPreviousPerformRequestsWithTarget:selector:object].

person Ben Gottlieb    schedule 03.12.2008
comment
+cancelPreviousPerformRequestsWithTarget:selector:object: метод класса (+), а не метод экземпляра (-). Вот почему он принимает цель (экземпляр) в качестве одного из своих аргументов. - person Peter Hosey; 03.12.2008
comment
Это намного проще в использовании, чем NSTimer. Или я что-то упускаю? - person Steph Thirion; 03.12.2008
comment
Это намного проще, но и менее гибко. - 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
comment
Должен ли метод выглядеть так? И нужно ли что-то делать с переданным экземпляром NSTimer? - person Steph Thirion; 03.12.2008
comment
Думаю, я прав, говоря, что метод должен выглядеть именно так. Параметр 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
comment
Не забудьте сохранить таймер, когда вы его настроите, и отпустите его после того, как вы сделаете его недействительным. Полагаться на цикл выполнения, чтобы сохранить его для вас, — плохой тон и риск поломки, если Apple когда-либо изменит реализацию. - person Peter Hosey; 03.12.2008