我会直接解决问题。
这个人一个星期以来吃了我的脑袋。
我打算做的是设置我的计时器,它应该在主运行循环中从辅助线程触发。所以我这样做。
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];
}
}
当过滤过程开启时,我停止父定时器。当我关闭时,我再次开始。
好的......所以现在问题......当我在我的页面上进行常规导航时,它的工作非常精细..就像切换标签,在页面之间遍历等。
但是,如果我使用过滤器进程,不知何故,它会在主页面上触发我的计时器,即使视图已经消失,似乎也会启动我的计时器事件。我想避免这种情况,但我只是不知道如何......
如果有人能真正帮助我,请做。 提前谢谢。
答案 0 :(得分:0)
你的代码中有一些有趣的东西:
[[NSRunLoop mainRunLoop] run]
- 这些方法甚至退出,或者你是否继续在线程上聚合线程?if (timerRefresh) if ([timerRefresh isValid]) [timerRefresh invalidate];
没有用;因为在Objective C中,消息传递nil
非常好。此类消息的结果始终为0x0
,因此第一个if
是不必要的,第二个在此情况下评估为NO
。if
也是不必要的 - 只留下[timerRefresh invalidate];
。-[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];
}