1

私が取り組んでいるプログラムでは、大量のデータ処理を実行しており、プロセスを視覚的に表すカスタムNSViewを描画できるようにしたいと考えています。

データクランチは、GCDを使用してメインスレッドから処理されます(順序を保持する必要があるため、dispatch_syncを使用します)。

for (int i=0; i<iterations; i++) {

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Add a data crunching task to the queue!
    });
}

処理が開始されると、タイマーを初期化します。タイマーは、カスタムディスプレイに定期的に再描画するように要求するために使用されます(このタイマーは、すべての処理タスクが完了すると無効になります)。

-(void)onTick:(NSTimer *)timer {

    [_customView setNeedsDisplay:YES];
    // Update some other UI object (labels etc.)    
}

これは期待どおりに機能していますが、今気付いた唯一の問題は、同じウィンドウのボタンをクリックして押したままにするか、プロセスの進行中にスライダーをドラッグし始めると、カスタムビューが再描画されることです。マウスを離すまで防げます!

できればすべてのコントロールを別のウィンドウに移動せずに、これを防ぐ方法はありますか?

4

2 に答える 2

4

yipタイマーはランループ上にあり、ドラッグアンドドロップ/トラッキングモードでは、ランループがコモンモードに進んでいないため、タイマーは起動されません。

必要なモードに追加します。

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(myTimerAction:) userInfo:nil repeats:YES];
[runloop addTimer:timer forMode:NSRunLoopCommonModes];
[runloop addTimer:timer forMode: NSEventTrackingRunLoopMode];

編集:runloopは基本的に、アプリに任意のイベントをディスパッチするためのAppleのwhileループです。そして、いわゆるモードに基づいてディスパッチするイベントをフィルタリングします。

于 2012-12-18T13:32:45.863 に答える