应用程序冻结在IOS 10中

时间:2016-12-06 04:07:51

标签: objective-c grand-central-dispatch nstimer ios10 xcode8.1

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

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

Here is the output from my pause:

Error showing after pause and debug:

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

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];      
                                });

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

for (int i = 0; i < inputToArray.length; i++) {
                if (Arrays.asList(dialTwo).contains(inputToArray[i]))
                    inputToArray[i]=2;
            ...

            }

1 个答案:

答案 0 :(得分: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];
}