3 Stimmen

Problem mit NSTimer

Bearbeiten2: Warum wurde nur der Fortschritt im "doSomething"-Methode aktualisiert, aber nicht point0?

Bearbeiten: mit dem Code, den ich habe. Ich weiß, dass ich etwas übersehen muss, aber ich konnte es einfach nicht finden.

Ich schreibe eine iPhone-App, die NSTimer verwendet, um einige Aufgaben auszuführen. Im Programm konnte ich den aktualisierten Wert der Variable, die sich innerhalb der NSTimer-Schleife befindet, nicht abrufen. Hier ist mein Code.

Schnittstellen-Datei

import

@interface TestNSTimerViewController : UIViewController {
    IBOutlet UIProgressView *progress;
    IBOutlet UIButton *button;
    IBOutlet UILabel *lable1;
    IBOutlet UILabel *lable2;
    NSTimer *timer;
    float point0;
}

@property (nonatomic, retain) UIProgressView *progress;
@property (nonatomic, retain) UIButton *button;
@property (nonatomic, retain) NSTimer *timer;
@property (nonatomic, retain) UILabel *lable1;
@property (nonatomic, retain) UILabel *lable2;

- (IBAction)buttonClicked:(id)sender;

@end

Implementierungsdatei

#import "TestNSTimerViewController.h"

@implementation TestNSTimerViewController

@synthesize progress;
@synthesize button;
@synthesize lable1;
@synthesize lable2;
@synthesize timer;

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
}

- (void)buttonClicked:(id)sender {
    point0 = 1.0f;
    lable1.text = [NSString stringWithFormat:@"%3.1f",point0];
    timer = [NSTimer scheduledTimerWithTimeInterval:0.05 
                                             target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
    lable2.text = [NSString stringWithFormat:@"%3.1f",point0];
}

- (void)doSomething {
    progress.progress = progress.progress+0.1;
    point0 = 2.0f;
    if (progress.progress == 1.0) {
        [timer invalidate];
    }
}
- (void)dealloc {
    [button release];
    [progress release];
    [lable1 release];
    [lable2 release];
    [timer release];
    [super dealloc];
}

@end

Nach der NSTimer-Schleife habe ich den Wert von point0 überprüft. Es hat sich nicht auf den Wert 2.3 geändert. Was ist falsch mit dem Code?

Vielen Dank,

0 Stimmen

Ich würde es auch nicht synthetisieren oder Eigenschaft es der float, können wir mehr Code sehen?

0 Stimmen

Im Methode habe ich den Timer gestartet, ich habe alles auskommentiert außer diese beiden Zeilen und Zeilen, um den Wert von Punkt0 auszudrucken.

0 Stimmen

Oh.. Ich habe auch Synthesieren und Eigenschaft des Floats entfernt, und das hat nicht geholfen.

0voto

RK- Punkte 11835

Vom Referenzdokument

Nach der Planung in einer Ausführungsschleife wird der Timer im angegebenen Intervall feuern, bis er ungültig wird. Ein nicht wiederholender Timer wird unmittelbar nach dem Feuern ungültig. Für einen wiederholenden Timer müssen Sie den Timer selbst ungültig machen, indem Sie seine invalidate-Methode aufrufen. Das Aufrufen dieser Methode fordert die Entfernung des Timers aus der aktuellen Ausführungsschleife an; daher sollten Sie die invalidate-Methode immer vom selben Thread aus aufrufen, in dem der Timer installiert wurde. Durch sofortiges Ungültigmachen des Timers wird dieser deaktiviert, sodass er die Ausführungsschleife nicht mehr beeinflusst. Die Ausführungsschleife entfernt und gibt dann den Timer frei, entweder kurz bevor die invalidate-Methode zurückkehrt oder zu einem späteren Zeitpunkt. Einmal ungültig gemacht, können Timerobjekte nicht wiederverwendet werden.

Der Timer, den Sie verwenden, ist ein wiederholender Timer, daher sollten Sie ihn überhaupt nicht ungültig machen. Oder verwenden Sie die folgende Zeile, denn der Timer muss jedes Mal feuern, wenn der Button geklickt wird. Ich habe den repeat-Parameter auf NEIN gesetzt.

timer = [NSTimer scheduledTimerWithTimeInterval:0.05 
                                         target:self selector:@selector(doSomething) userInfo:nil repeats:NO];

0 Stimmen

Ich habe versucht, die Wiederholungen auf NEIN zu setzen und die Fortschrittsleiste blieb bei 0,2 stehen. Meine Frage ist, ob der Fortschritt aktualisiert wurde, warum dann nicht Punkt0.

0voto

Mayosse Punkte 686
 - (void)buttonClicked:(id)sender {
point0 = 1.0f;
lable1.text = [NSString stringWithFormat:@"%3.1f",point0];
[self.timer invalidate];    
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.05 
                                         target:self selector:@selector(doSomething) userInfo:nil repeats:NO];
lable2.text = [NSString stringWithFormat:@"%3.1f",point0];

}

Dann in der doSomething Funktion:

 - (void)doSomething {
progress.progress = progress.progress+0.1;
point0 = 2.0f;
if (progress.progress < 1.0) {
    [self.timer invalidate];
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.05 
                                         target:self selector:@selector(doSomething) userInfo:nil repeats:NO);

}
}

Ich denke, du solltest die Fortschrittsvariable irgendwann zurücksetzen.

0voto

UpperLuck Punkte 31

Ich habe die Antwort gefunden. Die Zeile label2.text wird ausgeführt, bevor der NSTimer den Laufzyklus beendet. Ich muss meinen Code so umschreiben, dass er wartet, bis der NSTimer den Laufzyklus beendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X