NSTimer Uniqe的问题

时间:2011-05-06 12:35:05

标签: iphone ios4 iphone-sdk-3.0 nstimer

我会直接解决问题。

这个人一个星期以来吃了我的脑袋。

我打算做的是设置我的计时器,它应该在主运行循环中从辅助线程触发。所以我这样做。

if(timerRefresh)
{
    //[timerRefresh invalidate];
    timerRefresh = nil;
}

if (!self.isConnectionAvailable) {
    timerRefresh = [NSTimer timerWithTimeInterval:appDelegate.TimerInterval target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
}
else if (self.isLivePresent||self.isUpcomingMatchToday) {
    timerRefresh = [NSTimer timerWithTimeInterval:appDelegate.TimerInterval target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
}
else {
    timerRefresh = [NSTimer timerWithTimeInterval:LongRefresh target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
}

NSRunLoop *runLoop = [NSRunLoop mainRunLoop];
[runLoop addTimer:timerRefresh forMode:NSDefaultRunLoopMode];
[runLoop run];

当它触发时,加载器开始在主线程上加载,并且处理工作在辅助线程上完成。

我希望这是一种正确的方式。

现在我在这个主类中有一个子类,它也必须在触发过滤过程时显示加载器,所以为了避免多个加载器,当过滤过程触发时,我暂停这个父类的刷新,从子类发送通知......就像这样......

-(void)teamNameClicked:(id)sender
{
    BOOL result = YES;
    NSNumber *newNumber = [NSNumber numberWithBool:result];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"PauseMatchesLiveMatchTimer" object:newNumber];

    [self performSelector:@selector(sendTeamNameClickToFunction:) withObject:sender];
}

当操作完成时,我有另一个通知者......

-(void)processTeamNameClick:(id)sender
{
    UIButton *button = (UIButton *)sender;
    selectedIndexDropDown  = button.tag;

    [self parseTeamFile:button.tag];
    self.lblDropDown.text = [dictTeamFilter valueForKey:[NSString stringWithFormat:@"%i",button.tag]];
    [tblResults performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

    BOOL result = NO;
    NSNumber *newNumber = [NSNumber numberWithBool:result];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"PauseMatchesLiveMatchTimer" object:newNumber];
}

注意结果的YES和NO ..

现在这是通知的观察者......

-(void)pauseAndResumeTimer:(NSNotification *)notification;
{
    NSNumber *newNumber = [notification object];
    BOOL result = [newNumber boolValue];

    if (result) {
        if(timerRefresh)
        {
            if ([timerRefresh isValid])
                [timerRefresh invalidate];
            timerRefresh = nil;
        }
    }
    else 
    {
        if(timerRefresh)
        {
            if ([timerRefresh isValid])
                [timerRefresh invalidate];
            timerRefresh = nil;
        }

        if (!self.isConnectionAvailable) {
            timerRefresh = [NSTimer timerWithTimeInterval:appDelegate.TimerInterval target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
        }
        else if (self.isLivePresent||self.isUpcomingMatchToday) {
            timerRefresh = [NSTimer timerWithTimeInterval:appDelegate.TimerInterval target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
        }
        else {
            timerRefresh = [NSTimer timerWithTimeInterval:LongRefresh target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
        }

        NSRunLoop *runLoop = [NSRunLoop mainRunLoop];
        [runLoop addTimer:timerRefresh forMode:NSDefaultRunLoopMode];
        [runLoop run];
    }
}

当过滤过程开启时,我停止父定时器。当我关闭时,我再次开始。

好的......所以现在问题......当我在我的页面上进行常规导航时,它的工作非常精细..就像切换标签,在页面之间遍历等。

但是,如果我使用过滤器进程,不知何故,它会在主页面上触发我的计时器,即使视图已经消失,似乎也会启动我的计时器事件。我想避免这种情况,但我只是不知道如何......

如果有人能真正帮助我,请做。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

你的代码中有一些有趣的东西:

  • 首先,至少,我至少90%肯定你不想在任何程序的方法中调用[[NSRunLoop mainRunLoop] run] - 这些方法甚至退出,或者你是否继续在线程上聚合线程?
  • 其次,你的计时器失效有点奇怪:
    1. if (timerRefresh) if ([timerRefresh isValid]) [timerRefresh invalidate];没有用;因为在Objective C中,消息传递nil非常好。此类消息的结果始终为0x0,因此第一个if是不必要的,第二个在此情况下评估为NO
    2. 使计时器失效意味着将其从计划安排的runloop中删除。因此,第二个if也是不必要的 - 只留下[timerRefresh invalidate];
    3. 要使-[NSTimer invalidate]生效,在计划定时器的线程上调用需要。据我所知,你的所有方法都不是这样。因此,您应该使用performSelectorOnMainThread:withObject:waitUntilDone:代替相应的参数。
  • [self performSelector:@selector(sendTeamNameClickToFunction:) withObject:sender][self sendTeamNameClickToFunction:sender]之间没有区别。除了后者更容易阅读; - )
  • if中的pauseAndResumeTimer:条款没有多大意义,即代码重复很多。

这是一种整理方式的方法,并且在主线程上发生了无效:

-(void)pauseAndResumeTimer:(NSNotification *)notification
{
    [timerRefresh performSelectorOnMainThread:@selector(invalidate) withObject:nil waitUntilDone:YES];
    timerRefresh = nil;

    NSNumber *result = [notification object];
    if ([result boolValue]) return;

    if ( !self.isConnectionAvailable || self.isLivePresent || self.isUpcomingMatchToday ) {
        timerRefresh = [NSTimer timerWithTimeInterval:appDelegate.TimerInterval target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
    } else {
        timerRefresh = [NSTimer timerWithTimeInterval:LongRefresh target:self selector:@selector(startAutoRefresh) userInfo:nil repeats:NO];
    }

    [[NSRunLoop mainRunLoop] addTimer:timerRefresh forMode:NSDefaultRunLoopMode];
}