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 に答える