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 回答