0

我有课:

ClassX.m

@property (assign) BOOL wasProcessed;

-(void) methodA { //<- this can be called many times in short period of time
    dispatch_async(dispatch_get_main_queue(), ^{
        [self methodB];
    });
}

- (void) methodB {
    if (!self.wasProcessed) {
        self.wasProcessed = YES;

        //... some code
    }
}

由于使用了 dispatch_async,因此可以同时处理几个对 methodB 的调用,并且以下代码需要是原子的:

if (!self.wasProcessed) {
self.wasProcessed = YES; //e.g two calls can enter here before setting YES and it would be bad because I want to process it only one time

如何使这两行成为原子(检查和设置变量)?我不想制作“self.wasProcessed = YES;”之后的原子代码 所以将整个 if 移动到 @synchronize(self) 将不是一个好的解决方案。如果我的想法有任何问题,请指出,因为我对这些主题不是很有经验,谢谢。

4

2 回答 2

0

试试@synchronized。当封闭的代码在一个线程上执行时,它会阻止其他线程执行它。

- (void) methodB {
    @synchronized(self) {
        if (!self.wasProcessed) {
            self.wasProcessed = YES;

            //... some code
        }
    }
}
于 2013-07-30T05:46:24.633 回答
0
-(void) methodA {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSOperationQueue mainQueue] addOperationWithBlock:^(){
            [self methodB];
        }];
    });
}

你的 methodB 只会在主线程中被调用,所以它永远不会同时执行。

于 2013-07-30T13:10:57.967 回答