выполнить выбор после задержки не работает - PullRequest
6 голосов
/ 22 февраля 2012

Я использую следующий метод в подклассе uiview:

[self performSelector:@selector(timeout) withObject:nil afterDelay:20];

Метод вызывается через 20 секунд, как и ожидалось. В другом методе я пытаюсь отменить запрос на выполнение, используя следующий код:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];

я тоже пробовал

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];

оба сообщения не дают ожидаемого результата, и метод тайм-аута все еще вызывается. Кто-нибудь может объяснить мне, что я делаю неправильно и как это сделать правильно?

ура из Австрии мартин

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

две точки
1. Являются ли оба self одним и тем же объектом ??
2. Выполняется ли [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil]; в том же потоке, в котором вы вызвали [self performSelector:@selector(timeout) withObject:nil afterDelay:20];?

Проверьте эти две проблемы.

3 голосов
/ 22 февраля 2012

Используйте NSTimer, хранящийся в качестве переменной экземпляра в вашем классе.Если вы хотите отменить исполнение, сделать недействительным и уничтожить таймер.

В вашем @interface:

@property (readwrite, retain) NSTimer *myTimer;

В вашем @implementation:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeout) userInfo:nil repeats:NO];

Тогда,если возникает какое-то условие и метод тайм-аут больше не должен вызываться:

[self.myTimer invalidate];
self.myTimer = nil; // this releases the retained property implicitly
1 голос
/ 22 июня 2012

Попробуйте это:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO];
1 голос
/ 22 февраля 2012

Вы можете сделать это двумя способами:

  1. Вы можете использовать это, чтобы удалить все в очереди

    [NSObject cancelPreviousPerformRequestsWithTarget: self];

  2. вы можете удалить каждый из них в отдельности

    [NSObject cancelPreviousPerformRequestsWithTarget: self селектор: @selector (тайм-аут) объект: ноль];

...