NSRunLoop / NSTimer属于哪个源文件?

时间:2011-03-29 11:59:49

标签: iphone objective-c

我一直在试图弄清楚如何设置NSTimer以允许我在视图中的UILabel中打印当前时间,并让它每秒更新一次(不需要更精细的分辨率 - 只需一个简单的时钟)。

起初,我没有使用NSRunLoop,但如果我尝试包含一个,则执行只是在循环内“旋转”,阻止进一步执行。我在下面发布了我的代码。

-(id) printCurrentTime {

now = [NSDate date];
dateFormat = [[NSDateFormatter alloc] init];

[dateFormat setTimeStyle:NSDateFormatterMediumStyle];

NSString *nowstr = [dateFormat stringFromDate:now];
[dateFormat release];
NSLog(@"Current time is: %@",nowstr);

return nowstr;
}

在ViewController源文件中,我按照:

执行
TimeStuff *T = [[TimeStuff alloc] init];
NSString *thetime = [T printCurrentTime];
[timelabel setText:thetime];
[T release];
[self.view addSubview:timelabel];


NSTimer *timmeh = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(printCurrentTime) userInfo:nil repeats:YES];

[[[NSRunLoop currentRunLoop] addTimer:timmeh forMode:NSDefaultRunLoopMode] run];

“TimeStuff”类实际上是一个空类,除了printCurrentTime函数。

问题:

1)我应该在AppDelegate类中包含RunLoop吗?我无法想象这一切应该如何挂在一起,例如 - 基于Timer实现循环的步骤是什么,以最新的时间更新文本标签。很难过。

2)如果我应该使用NSThread,那么它也应该在它自己的类/ Delegate类中。

3)ViewController类是否完全超出了循环/定时器的界限,只是“eye candy”类,在Delegate类中回调函数?

感谢您的时间和耐心。

1 个答案:

答案 0 :(得分:2)

您根本不需要处理运行循环。

这一行:

NSTimer *timmeh = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(printCurrentTime) userInfo:nil repeats:YES];

将创建一个计时器并将其附加到当前线程的运行循环中。您根本不需要[NSRunLoop addTimer:forMode:]来电 - 您可以删除该行。

PS你当然不需要像NSThreads那样!


编辑关于你的评论:

如果这是printCurrentTime方法所在的位置,则需要为计时器创建一个TimeStuff类的实例。即。

@interface MyViewController : UIViewcontroller {
    TimeStuff *timeStuff
}

并在viewDidLoad方法中:

- (void)viewDidLoad {
    [super viewDidLoad];

    ...

    // Create our timestuff if we don't have one already
    if (nil == timeStuff)
        timeStuff = [[TimeStuff alloc] init];

    // Start the timer
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:timeStuff selector:@selector(printCurrentTime) userInfo:nil repeats:YES];

并且不要忘记dealloc

- (void)dealloc {
    [timeStuff release];
    ...
    [super dealloc];
}

传递timeStuff作为计时器的目标告诉它在哪里寻找printCurrentTime方法!

希望有所帮助,

PS所有行@class TimeStuff都告诉编译器有一个名为TimeStuff的类。它不知道您想将它用于计时器的选择器!