Проблема с NSTimer - PullRequest
       1

Проблема с NSTimer

3 голосов
/ 25 августа 2010

Edit2: почему только прогресс был обновлен в методе "doSomething", но не point0?

Редактировать: с кодом, который у меня есть.Я знаю, что должен что-то упустить, но я просто не смог его найти.

Я пишу приложение для iphone, которое использует NSTimer для выполнения некоторых задач.В программе я не смог получить обновленное значение переменной, обновленной внутри цикла NSTimer.Вот мой код.

Файл интерфейса

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

Файл реализации

#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

После цикла NSTimer я проверил значениеpoint0.Это не изменило значение до 2,3.Что не так с кодом?

Спасибо,

Ответы [ 3 ]

0 голосов
/ 25 августа 2010
- (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];

}

Затем в функции doSometing:

- (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];



}
}

Я думаю, вы должны сбросить переменную прогресса в какой-то момент.

0 голосов
/ 26 августа 2010

Я нашел ответ. Строка label2.text выполняется до того, как NSTimer завершит цикл выполнения. Мне нужно переписать мой код так, чтобы он ожидал, пока NSTimer не завершит цикл выполнения.

0 голосов
/ 25 августа 2010

Из Справочного документа

После того, как запланировано в цикле выполнения, таймер срабатывает с указанным интервалом, пока он не станет недействительным. Неповторяющийся таймер делает себя недействительным сразу после срабатывания. Однако для повторяющегося таймера вы должны самостоятельно аннулировать объект таймера, вызвав его метод invalidate. Вызов этого метода запрашивает удаление таймера из текущего цикла выполнения; в результате вы всегда должны вызывать метод invalidate из того же потока, в котором был установлен таймер. Аннулирование таймера немедленно отключает его, чтобы он больше не влиял на цикл выполнения. Затем цикл выполнения удаляет и освобождает таймер либо непосредственно перед возвратом метода invalidate, либо в какой-то более поздний момент. Будучи недействительными, объекты таймера не могут быть повторно использованы.

Таймер, который вы используете, является повторяющимся таймером, так что вам вообще не следует его аннулировать. Или используйте следующую строку, потому что таймер должен срабатывать при каждом нажатии кнопки. Я установил параметр повтора на NO.

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