2012-11-19 11 views
18

Sto usando Objective-C, Xcode 4.5.1 e sto lavorando su un'app per iPhone.Come chiamare un metodo ogni x secondi in Objective-C usando NSTimer?

Ho un metodo A in cui voglio chiamare un altro metodo B per eseguire una serie di calcoli ogni x secondi. Nel metodo A inizio a riprodurre un file audio. Il metodo B monitorerà l'audio ogni x secondi per la durata del file audio.

Ho trovato NSTimer come una potenziale soluzione, ma sto avendo difficoltà a farlo funzionare/capirlo.

Voglio semplicemente chiamare il metodo B ogni x secondi ed eseguire i suoi calcoli, ma NSTimer mi richiede di fornire diverse cose di cui non sono sicuro di cosa dovrei dirlo.

[NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval) 
target:(id) select:(SEL) userInfo:(id) repeats:(BOOL)]; 

è la mia comprensione che alla NSTimeInterval fornisco l'intervallo in cui voglio NSTimer di operare. Ma come posso dire che esegue il metodo B?

Ho esaminato il codice di esempio e sono attualmente sotto l'impressione che fornisca il metodo allo select:. Ma cosa scrivo al 'target:'? Perché dovrei avere bisogno di un obiettivo? Ho cercato di entrare 'self', ma Xcode mi dice:

L'utilizzo di identificatore non dichiarato 'sé'

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self 
select:@selector(targetMethod:myVolumeMonitor()) userInfo:nil repeats:YES]; 

Quindi, immagino 'self' che si suppone essere un puntatore ad un oggetto , ma dove voglio puntare?

Qui di seguito è una semplificazione del mio codice:

MethodA() 
{ 
//Start playing an audio file. 

//NSTimer calling Method B, as long the audio file is playing, every x seconds. 
} 

MethodB() 
{ 
//Do calculations. 
} 

sarei grato se qualcuno mi potrebbe fornire alcune risposte/mi punto nella giusta direzione! (:.

risposta

33

destinazione è il destinatario del messaggio chiamato in select. Nelle funzioni Objective-C non vengono chiamate. Ci sono piuttosto messaggi inviati agli oggetti. L'oggetto si riferisce internamente alla sua tabella dei simboli e determina quale dei suoi metodi viene chiamato. Quello è un selettore. Il tuo selettore è @selector(MethodB). (BTW: dovresti iniziare i nomi dei metodi con lettere minuscole. "MetodoB" sarebbe più appropriato qui.) Questo porta alla domanda: come determinare l'oggetto a cui viene inviato il messaggio? Questo è l'obiettivo. Nel tuo caso, è semplicemente self.

BTW: In questo caso il selettore è previsto restituire void e accettare un id, che è l'id dell'oggetto NSTimer stesso. Questo ti tornerà utile se vuoi che il timer smetta di sparare in base ad alcune condizioni in base alla logica del tuo programma. Più importante: il tuo selettore è quindi methodB: anziché methodB.

- (void) methodA 
{ 
//Start playing an audio file. 

//NSTimer calling Method B, as long the audio file is playing, every 5 seconds. 
[NSTimer scheduledTimerWithTimeInterval:5.0f 
target:self selector:@selector(methodB:) userInfo:nil repeats:YES]; 
} 

- (void) methodB:(NSTimer *)timer 
{ 
//Do calculations. 
} 
+0

Grazie per la risposta! Sei stato di grande aiuto! Sono riuscito a capire tutto! (: @Hermann Klecker – RoelfMik

+0

Siete i benvenuti. Se fosse stato utile, comunque, non mi dispiacerebbe un 'accettare'. :) –

+0

Con un clic del mio mouse ti ho concesso un 'accept' :) – RoelfMik

4

Ebbene si sta tentando di chiamare un metodo di C normale, NSTimer non può a quel

L'obiettivo è l'un'istanza della classe su cui chiamare il selector, questo selettore adn Non selezionare. il selettore ecco un tipo SEL che è possibile creare con la funzione @selector(METHOD_NAME).

Per esempio questo chiamerà il handleTimer : sempre 0.1 secondo: (In questo esempio l'AppDelegate è utilizzato):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    //SNIP, some code to setup the windos. 

    [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
    return YES; 
} 

- (void) handleTimer:(NSTimer *)timer { 
    // Hanlde the timed event. 
} 
+0

Grazie per la risposta! Sono riuscito a capire tutto! (: – RoelfMik

4

Se si guarda il codice e rispetto a quello qui sotto

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self 
select:@selector(targetMethod:myVolumeMonitor()) userInfo:nil repeats:YES]; 

sé significa che si sta invocando un metodo in stessa istanza della classe, nel tuo esempio il metodo è myVolumeMonitor

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self 
selector:@selector(MethodB) userInfo:nil repeats:YES]; 

e vi sono buone per andare anche se

metodo di essere dovrebbe assomigliare a questa

- (void)MethodB:(NSTimer*)timer { 
// do something 
} 
+0

Select non fa parte del metodo 'scheduledTimerWithTimeInterval', anche i nomi dei metodi dovrebbero iniziare con un minuscolo – rckoenes

+0

Non so, copiato questo dal codice sorgente delle app funzionanti. Ok, sì ho cambiato selettore per selezionare mentre cercavo di evidenziare la mia risposta – CodeBro

+0

Il metodo che chiamate nell'esempio non esiste: ['scheduledTimerWithTimeInterval: target: selector: userInfo: ripetizioni:'] (https://developer.apple.com/library/IOS/#documentation/Cocoa/Reference/Foundation/Classes /NSTimer_Class/Reference/NSTimer.html#//apple_ref/doc/uid/20000319-CHDDAEIA) questo dovrebbe essere il metodo – rckoenes

4

provare questo

NSTimer *aTimer = [NSTimer timerWithTimeInterval:(x) target:self selector:@selector(timerFired:) userInfo:nil repeats:YES]; 

    NSRunLoop *runner = [NSRunLoop currentRunLoop]; 
    [runner addTimer:aTimer forMode: NSDefaultRunLoopMode]; 
    [popUpImageView release]; 

- (void)timerFired:(NSTimer*)theTimer 
{ 
if(condition) 
{ 
    [theTimer isValid]; //recall the NSTimer 
    //implement your methods 
} 
else 
{ 
    [theTimer invalidate]; //stop the NSTimer 

} 

} 
+0

Grazie per il vostro risposta! Sono riuscito a risolvere il problema! :) – RoelfMik

Problemi correlati