0

タイマーのイベント ハンドラー内のクラス プロパティへの読み取り/書き込みアクセスを提供したいだけでなく、イベント ハンドラーの外側のクラス内の他の場所でも同じプロパティを更新したいと考えています。正しいデータが読み取られ、更新されていることを確認するには、どのような予防措置を講じる必要がありますか?

一般的なロジックは次のとおりです。

// declared in the class header and initialized to 1 in init
@property (nonatomic, strong) NSNumber           *sharedItem;
@property (nonatomic, assign) dispatch_source_t  timer;

// Method invoked independent of the timer
- (void)doSomeWork {
    // QUESTION: During a timer tick, will it access the correct version of 
    // sharedItem that is updated here? 
    // Do I need to protect this area with a critical section/lock?
    sharedItem = [NSNumber numberWithInteger:[sharedItem intValue] + 1];
}

- (void)myTimerRelatedMethod {

    // Creating the timer
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(self.timer, startTime, interval, leeway);

    // Timer's event handler run for each tick
    dispatch_source_set_event_handler(self.timer, ^{
        if ([sharedItem intValue] > 10) {
            // 1. Do something 
            // 2. Then cancel the timer
        }
    });

    dispatch_resume(self.timer);
}
4

1 に答える 1

0

単純なプリミティブの場合は、プロパティをアトミックに設定するだけで、スレッド間の読み取りと書き込みの不整合について心配する必要はありません。

ポインターの場合、プロパティをアトミックに設定することに加えて、読み取りと書き込みの一貫性を回避するために@synchronizeを使用する必要があります。

また、タイマーが残りのコードと同じスレッドにある場合(メインスレッド+ランループ上)、タイマーイベントは残りのコードで発生する同じランループによって発生するため、何もする必要はありません。メインスレッドコードであり、真に同時ではありません。

于 2012-10-20T17:24:34.133 に答える