0

我开发了一个应用程序,它使用GCD计时器和Sqlite数据库,它在 IOS8 和 IOS9 中运行良好,但在 IOS10 中失败,它不会崩溃但它会冻结我使用的是 Xcode 8.1。应用程序的工作流程是,当我单击按钮时,计时器将开始在后台运行并继续更新标签以及表列表数据并将相同的数据插入到 sqlite 数据库中。

在这里我的问题是,当我继续单击按钮以更新数据时,它工作正常,直到它在突然冻结并阻止 UI 后插入 50-60 条记录,以便检查我是否已调试代码,我提出了假设它失败了,因为它阻塞了线程,但我没有找到任何解决方案,请帮助我解决我的问题,谢谢。

这是我暂停的输出:

暂停和调试后显示错误:

单击按钮事件时,我试图重新加载表并在其中显示记录,并将数据插入到 sqlite 数据库中,并且我有一个标签,其中显示了计时器数据。

dispatch_async(dispatch_get_main_queue(), ^{
        self.lbltimer.text = [NSString stringWithFormat:@"%.4f", Timeinterval];
    });

下面是我如何使用连续运行的 GCD 计时器的代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                                    self.aTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(ShowTime:) userInfo:nil repeats:YES];      
                                });
4

1 回答 1

0

我认为您应该通过触发在主线程上启动计时器:

-(IBAction)clickEven:(id)sender{     

 self.aTimer = [NSTimer scheduledTimerWithTimeInterval:0.1    
target:self selector:@selector(ShowTime:) userInfo:nil repeats:YES]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 //Sqlite operation 
dispatch_async(dispatch_get_main_queue(), ^{
   [self.aTimer invalidate];
   });
});
}

-(void)ShowTime:(NSTimer*)timer {
 self.lbltimer.text = [NSString stringWithFormat:@"%.4f", Timeinterval];
}
于 2016-12-06T13:03:40.650 回答