我有课:
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如何使这2行成为原子(检查和设置变量)?我不想让原子代码出现在"self.wasProcessed =YES“之后;所以移动整个if到@synchronize(self)将不是一个好的解决方案。如果我的想法有什么问题,请指出,因为我在这些问题上不是很有经验,谢谢。
发布于 2013-07-30 05:46:24
尝试@同步。当所附代码在线程上执行时,它将阻止其他线程执行它。
- (void) methodB {
@synchronized(self) {
if (!self.wasProcessed) {
self.wasProcessed = YES;
//... some code
}
}
}发布于 2013-07-30 13:10:57
-(void) methodA {
dispatch_async(dispatch_get_main_queue(), ^{
[[NSOperationQueue mainQueue] addOperationWithBlock:^(){
[self methodB];
}];
});
}您的methodB将只在主线程中被调用,因此它永远不会同时执行。
https://stackoverflow.com/questions/17938947
复制相似问题