2013-03-19 13 views
12

wiem, można to zrobić za pomocą:opóźnić wywołanie metody w Objective-C

[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0] 

Jednak problem jest, że chcę tylko 1 wywołanie metody mają być wykonane. Dzięki tej funkcji połączenia będą się układać jeden na drugim. Chcę nawiązać połączenie i jeśli zostanie wykonane inne połączenie, pierwszy zostanie odwołany. Pomysły?

+3

'performSelector: withObject: afterDelay:' wykonuje selektor ** dokładnie jeden raz. ** Nie widzę twojego problemu. –

+1

Czy próbujesz wywołać wiele 'performs', a następnie chcesz wykonać tylko ostatni? –

+0

Tak, Inder. Dokładnie chcę tego zrobić. Przepraszam za bycie niejasnym. – Michael

Odpowiedz

14

Gdy metoda jest wykonywany wówczas nie ma możliwości zatrzymania go.

Ale możesz anulować, jeśli nie jest on uruchomiony. Można zrobić coś takiego

//.... your code 
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil]; 
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; 
//.... your code 

W ten sposób można anulować poprzednie wykonać tylko wtedy, gdy żądanie myMethod nie jest zwolniony.

+0

Doskonale, dziękuję! – Michael

+0

Mogłem idealnie wykorzystać twoją końcówkę do przyrostowego zestawu przycisków (tutaj: GÓRA i DÓŁ), który nie powinien bezwiednie przenieść swojego zestawu wartości do sprzętu. każde dotknięcie resetuje licznik czasu, aż ostatnie uderzenie wywoła ostateczną wartość. –

13

W Fragment kodu biblioteki w Xcode można znaleźć jeden o nazwie GCD: Dispatch potem, który wygląda tak:

double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     <#code to be executed on the main queue after delay#> 
    }); 

Dość oczywiste.

+0

+1 To jest dokładnie to, czego szukałem. Ta implementacja jest świetna, ponieważ można wykonywać pełne wywołania metod, nawet jeśli mają wiele parametrów i wyglądają ładnie. Ponadto, jak powiedziałeś, nie wymaga to objaśnień, zarówno dla programisty, jak i dla kolejnych programistów. – Firo

2

Powinieneś wykonać ten selektor w jakimś innym wątku, aby uniknąć stosu, gdy pytałeś. użyć

[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)]; 

W tym selektorze można dodać opóźnienie, co chcesz. Ponieważ proces ten będzie prowadzony w osobnym wątku, więc nie zatrzyma innych za opóźnienia

2

EDIT: Teraz wiem, że chcesz używać tylko najnowsza, można zamiast tego użyć:

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

Zobacz this link po więcej informacji.

Original post:

Można tylko mieć BOOL, który jest ustawiony na NO, gdy osiągnie ten punkt, a następnie przywrócić TAK po metoda jest wykonywana.

Tak więc, na przykład, będzie to wyglądać mniej więcej tak:

if (boolVal) { 
    boolVal = NO; 
    [self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]; 
} 

Następnie w myMethod mają:

boolVal = YES;