2012-07-18 10 views
5

Bez tworzenia wielu instancji NSTimer, jak można uzyskać NSTimer, aby wystrzelić określoną lub wielokrotną metodę z różnymi interwałami w sekwencji. Na przykład metoda 1 (0,3 s), metoda 2 (0,5), metoda 3 (0,7) i tak dalej.NSTimer z wieloma przedziałami czasowymi w sekwencji

Byłbym wdzięczny, gdyby ktoś mógł podzielić się przykładowym kodem.

Odpowiedz

5

Nie jestem pewien, jaki jest twój ostateczny cel, ale po przeczytaniu twojego pytania: Polecam wypróbować w następujący sposób:, może to jest to, czego szukasz.

powinieneś umieścić ten kod tam, gdzie normalnie chciałeś rozpocząć tę samą klasę NSTimer z różnymi interwałami (co niestety nie jest możliwe).

{ 
    // ... 
    [self performSelector:@selector(method1) withObject:nil afterDelay:0.3f]; 
    [self performSelector:@selector(method2) withObject:nil afterDelay:0.5f]; 
    [self performSelector:@selector(method3) withObject:nil afterDelay:0.7f]; 
    // ... 
} 

, a kiedy trzeba niezaplanowane wszystkie te selektory w kolejce, użyj tego kodu.

[NSObject cancelPreviousPerformRequestsWithTarget:self]; 
+1

Dzięki, użyłem już tego samego kodu, Dodatkowo dodałem sposób anulowania oczekujących żądań. –

4

NSTimer sam w sobie nie zapewnia tej funkcji, jest uruchamiany raz lub wielokrotnie w stałych odstępach czasu. Aby osiągnąć ten efekt, będziesz potrzebować wielu timerów lub całkowicie odejść od NSTimer.

-3

stworzyć czasomierz z selektora z TimeInterval = 0,1 stamtąd w sposobie wyboru, można sprawdzić poprzez utrzymywanie zmiennej pływaka statyczne i dodać 0,1 do niego za każdym razem jak:

static CGFloat counter= 0; 

counter+= 0.1; 

następnie sprawdzić wartość licznika i zadzwoń do metod ur ..

if(0.3 == counter) 
{ 
    [self callMethod1]; 
} 
else if(0.5 == counter) 
{ 
    [self callMethod2]; 
} 
else if(0.7 == counter) 
{ 
    [self callMethod3]; 
} 
... 
... 
.. 
.. 
+0

Porównywanie pływaków z == powoduje kłopoty, ponieważ są to przybliżenia binarne dziesiętnej reprezentacji. – jbat100

+0

ale dodajemy tylko 0,1 w naszym kodzie, a wartości liczników nie są przybliżeniem wynikającym z obliczeń opartych na nieokreślonych czynnikach, takich jak licznik czasu. wartości liczników nie zależą od interwału czasowego, a nie od tego, ile razy metoda zostanie wywołana. to jest jak 'i + = 1;' więc nie powinno być żadnych problemów. – samfisher

+1

Lepiej używać liczby całkowitej, zwiększaj liczbę całkowitą o 1 co 100 milisekund, i użyj 'if ((counter% 3) == 0)' etc ... – dreamlax

0

Uważam, że należy przekazać bieżący przedział czasu do wypalonego selektora i dalej go obsługiwać. jeśli odstęp czasu wynosi 0,3 zadzwonić method1, 0,5 - Method2, tam najprawdopodobniej żaden inny sposób zaimplementować to

-1

Zrób owijki owinąć połączenia NSTimer metody takie jak to:

- (void) CallTimerWithTimeInterval:(float) interval andSelector:(NSString *)methodName 
{ 
SEL selector = selectorFromString(methodName); 
    [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(selector) userInfo:nil repeats:YES]; 
} 

You można wywołać tę metodę i przekazać metodę interwału i selektora zgodnie z wymaganiami.

+0

Dzięki, użyłem drugiej metody. Btw, jeśli użyję tej metody, Czy muszę zatrzymać lub zerować licznik czasu, który tworzy na dowolnym etapie? jak to osiągnąć? –

+0

Aby zatrzymać stoper, należy ustawić parametr 'repeat' na" NO ". Możesz to zrobić, dodając kolejny parametr do funkcji opakowania. '- (void) CallTimerWithTimeInterval: (float) interval andSelector: (NSString *) methodName withRepeats: (BOOL) YESORNO'. –

+0

Dzięki za pomoc, po prostu ciekawy, czy to podejście jest lepsze od tego, które wybrałem. Scenariusz jest taki, że musiałbym wielokrotnie wywoływać tę metodę, powiedzmy 10 razy. Utworzy 10 kopii programu NSTimer, które zostaną uruchomione w określonym czasie. Teraz, jeśli gdzieś w środku, chciałbym zakończyć wszystkie zegary na raz, powtórzenie NIE może nie pomóc, ponieważ zatrzymuje się na ponownym wystąpieniu. Po zaplanowaniu 10 kopii, jak mógłbym to zatrzymać. Utwórz zmienną instancji NSTimer, a następnie wyślij wiadomość zerową? –