2016-04-27 8 views
-1

Ich erstelle ein NSTimer:Kann ich einen NStimer in einem anderen NStimer verwenden?

timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(sendImage) userInfo:nil repeats:YES]; 

Bei dem Verfahren sendImage erstelle ich eine andere NSTimertimer2. Der Code folgt:

- (void)sendImage 
    { 
    for(int i = 0;i < 50 ; i++) 
    { 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
     [dict setObject:socket forKey:@"socket"];//parameter which deliver to the method`sendPieceOfImage` 
     [dict setObject:pData forKey:@"pData"]; 
     timer2 = [NSTimer scheduledTimerWithTimeInterval:0.002f target:self selector:@selector(sendPieceOfImage:) userInfo:dict repeats:NO]; 
    } 
    } 

Aber es hat nicht funktioniert. Ich möchte wissen, kann NSTimer mechanisch anwenden? Wenn es undurchführbar ist, was kann ich in der sendImage tun. Ich hoffe jeder Zyklus im for() kann mit Intervall laufen.

+5

"Aber es hat nicht funktioniert" - hat es einen Fehler erzeugt, sprengen, ein Ei braten ;-) usw.? Detail hilft den Menschen, Ihnen zu helfen. Bearbeiten Sie Ihre Frage, um Details hinzuzufügen, und möglicherweise kann jemand helfen. – CRD

+0

Funktioniert der erste Timer? Wird die 'sendImage' Methode aufgerufen? –

+1

Sie erstellen den Timer 50 mal neu? Wie soll das funktionieren? – trojanfoe

Antwort

0

Die Antwort auf Ihre Frage ist JA. Das ist möglich, um einen Timer im feuernden Rückruf eines anderen zu planen. Bedenken Sie:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer1Event:) userInfo:nil repeats:YES]; 
}); 

- (void)timer1Event:(NSTimer*)timer { 
    NSLog(@"timer1Event"); 
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timer2Event:) userInfo:nil repeats:NO]; 
} 

- (void)timer2Event:(NSTimer*)timer { 
    NSLog(@"timer2Event"); 
} 

Auch ist das Problem nicht vollständig beschrieben, ich werde versuchen zu erraten, dass die rootCause in ist, wie sehr erste Timer geplant ist.

Sie benötigen ein Gewinde mit einem richtig eingestellten RunLoop. Hauptgewinde ist geeignet.

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(sendImage) userInfo:nil repeats:YES]; 
}); 

Wenn Sie nicht den Haupt-Thread laden möchten, bedenken Sie:

Sie Ihre eigenen Thread benötigen:

self.workerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startRunLoop) object:nil]; 
[self.workerThread start]; 

, die die Runloop beginnt:

- (void)startRunLoop 
{ 
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
    [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; 
    do { 
     @autoreleasepool 
     { 
      [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]]; 
     } 
    } while (![NSThread currentThread].isCancelled); 
} 

Jetzt zum Starten des Timers auf dem Arbeitsthread benötigen Sie:

- (void)startTimer 
{ 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerEvent:) userInfo:nil repeats:YES]; 
} 

Wie Aufruf:

[self performSelector:@selector(startTimer) onThread:self.workerThread withObject:nil waitUntilDone:NO]; 

Hoffe, es hilft.

+0

Vielen Dank, mein Freund ... aber es passt nicht zu meinem Programm. –

+0

Gut @X.Rodi, wahrscheinlich habe ich deine Frage missverstanden. Es sieht so aus, als ob Sie an "Async pice of image sending" statt an "Timer innerhalb eines Callbacks auf einen anderen Timer einplanen" interessiert sind. –

+0

Ihre Antwort hat mir in einem anderen Problem geholfen. Danke nochmal. –