首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标-C并发处理

目标-C并发处理
EN

Stack Overflow用户
提问于 2013-07-30 05:30:43
回答 2查看 169关注 0票数 0

我有课:

代码语言:javascript
复制
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的调用,下面的代码需要是原子的:

代码语言:javascript
复制
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)将不是一个好的解决方案。如果我的想法有什么问题,请指出,因为我在这些问题上不是很有经验,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-30 05:46:24

尝试@同步。当所附代码在线程上执行时,它将阻止其他线程执行它。

代码语言:javascript
复制
- (void) methodB {
    @synchronized(self) {
        if (!self.wasProcessed) {
            self.wasProcessed = YES;

            //... some code
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-07-30 13:10:57

代码语言:javascript
复制
-(void) methodA {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSOperationQueue mainQueue] addOperationWithBlock:^(){
            [self methodB];
        }];
    });
}

您的methodB将只在主线程中被调用,因此它永远不会同时执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17938947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档