2013-06-18 3 views
0

Как я могу назвать этот метод, - (void)displayView:(UIView *)view arg:(UILabel *)label { } после задержки 0,5 секунды?Call Objective-C Method

Я пробовал [self performSelector:@selector(displayView:) withObject:view afterDelay:.5];, но только минус вид в качестве параметра.

Как передать два параметра методу с задержкой в ​​0,5 секунды?

+0

Это совсем не связано с Xcode. –

+3

Кстати, оберните аргументы в словарь и бум, вы сделали 1 arg из N args. –

+0

@ H2CO3 Извините. Хорошая точка зрения. Я могу попробовать. Благодарю. –

ответ

6

Используйте блок вызова отсроченной:

Главная нить:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    [self displayView:view arg:label]; 
}); 

Фоновый поток:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [self displayView:view arg:label]; 
}); 
+0

'dispatch_get_current_queue' устарел. Я попробовал это. –

+0

@HenryHarris: Спасибо, исправлено. – Regexident

+0

AHHHH Я потратил полчаса, пытаясь выяснить обновленный способ сделать это! Большое спасибо! –

-2
- (id)performSelector:(SEL)aSelector 
      withObject:(id)anObject 
      withObject:(id)anotherObject 

Apple Documentation От:

[self performSelector:@selector(displayView:arg:) 
      withObject:myView 
      withObject:myLabel]; 

Но я действительно предлагаю вам пойти с GCD:

Другим вариантом dispatch_after, который будет принимать блок и епдиеий его в определенное время.

double delayInSeconds = 5.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 

    [self displayView:myView arg:myLabel]; 

}); 

Еще один способ использует NSTimer:

myTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
    target:self 
    selector:@selector(displayViewWitharg:) 
    userInfo:dict 
    repeats:NO]; 

// where dict is NSDictioary with key-value pair, which contains your parameters which you want to pass. 

И вот каждый раз, когда вам требуется вы можете аннулировать этот таймер, чтобы остановить процесс.

Надеюсь, это вам поможет

+0

Я попробовал 'dispatch_after' некоторое время назад и столкнулся с предупреждением об устаревании на' dispatch_get_main_queue(); '. Я верю. Я не знаю, правильно ли это вы делаете, но я могу попробовать. Благодарю. :) –

+0

Я добавил 3 различных примера для запуска процесса в отдельном потоке. Вы можете выбрать любой из них в соответствии с вашей выполнимостью. – Mrunal

+0

@Mrunal 'performSelector: withObject: withObject' не запускается в отдельном потоке - он работает на основе цикла (подробнее см. Документацию для' NSRunLoop'). Кроме того, он не предоставляет способ указать задержку .5 секунд, требуемую OP. Пример 'NSTimer' вводит в заблуждение. Экземпляры 'NSTimer' не могут вызывать методы с пользовательскими сигнатурами; подпись должна быть '- (void) methodName: (NSTimer *) timer'. – jlehr