NSTimer在不同功能中使用时无法正常工作

时间:2012-11-29 06:35:40

标签: objective-c nstimer nsoperation

当我使用它时,ns计时器工作,它调用foo1和foo1

-(void)register1
{
    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(foo) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];
     [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(foo2) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];
    [runLoop run];
}

但我的要求是我必须在不同的函数中使用nstimer,以便我可以创建两者的操作。下面的代码只调用第一个函数。当我从main调用register1和register2时,只注册1个定时器。最重要的一个

-(void)register1
{
    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(foo) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];

    [runLoop run];
}
-(void)register2
{

    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(foo2) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];
    [runLoop run];
}

我已经找到了我的问题的答案,我想我也应该告诉其他人。解决方法是我必须为每个函数使用不同的线程。我在main中使用nsoperation

abc *ab=[[abc alloc]init];
//[ab register1];
  //  [ab register2];


    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    NSInvocationOperation *abc=[[NSInvocationOperation alloc]initWithTarget:ab selector:@selector(register1) object:(nil)];
    NSInvocationOperation *abc2=[[NSInvocationOperation alloc]initWithTarget:ab selector:@selector(register2) object:(nil)];
   [queue addOperation:abc];
    [queue addOperation:abc2];

2 个答案:

答案 0 :(得分:1)

  1. 当您使用-[NSRunLoop addTimer:forMode:]时,请勿致电+[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:] - 这是多余的。该名称的计划部分说明了一切:它正在为您创建一个已安排在当前runloop上的计时器。
  2. 一般情况下,请勿致电-[NSRunLoop run]。它无限期地运行runloop。它基本上永远不会回来所以你的第二个函数实际上并没有被调用,因为你永远不会从第一个函数返回。您可以通过在各个位置插入NSLog语句或在调试器中单步调试代码来轻松确认。
  3. 如果您发布更多代码 - 尤其是您的main()函数 - 那么我们可以为您提供进一步的答案。通常你只想从main()调用 - [NSRunLoop run](或其变体)。

答案 1 :(得分:0)

你可以像这样获得NSTimer的点地址

NSTimer NSTimer * aTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(foo)userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];

并将其用于另一种方法。