ios停止2个线程同时使用方法

Gle*_*n S 3 multithreading objective-c ios

我们有一个错误,它破坏了UI的外观,一些UI元素重叠,或者已经被添加到子视图两次.这个bug几乎没有复制,所以很难修复它.现在我想到了原因,可能改变UI的方法同时被调用了两次.我是对的,我试图以编程方式创建错误.

我们有一个错误,它是由不同线程同时访问的方法引起的.要模仿这个问题,并更好地理解它.见下面发布的代码.

当我这样做,updatePresence方法调用,我的程序完美

ViewController.m

-(void)loadConversationScreen{
    [conversationController updatePresence];
}
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我的程序出了问题

ViewController.m

-(void)loadConversationScreen{
    [conversationController performSelectorInBackground:@selector(updatePresence) withObject:nil];
    [conversationController updatePresence];

}
Run Code Online (Sandbox Code Playgroud)

这是因为正在同时访问该方法,并且同时也正在访问/更改我的UIView的实例.

如何正确地阻止2个线程同时使用某个方法?

我如何在IOS中正确处理它(如果没有正确的方法,有什么工作),是否有内置锁或某些东西?

我的应用程序应支持ios 4.0及更高版本

感谢所有人的帮助.

Ste*_*her 5

最好的线程锁是你@sycnhronized(object) {}.这意味着一次只能有一个线程输入代码.传入的对象用于执行锁定; 只有一个线程可以进入受特定对象保护的块,一次同步.其他人会等.这可以是任何Objective-C对象,甚至是NSString.

通常,您将使用您尝试保护的任何对象免受多个线程的攻击.你可能想要@synchronized(self) {}:

-(void)updateVariables {
    @synchronized(self) {
        _foo = 1;
        _bar = 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

@sycnhronized在同一个线程可以@sycnhronized根据需要深入调用的意义上是重入的,例如:

- (void)a {
    @synchronized(self) {
        // entered "immediately" if called from b, where the @synchronized has
        // already been called
        _foo = _foo + 1;
    }
}

- (void)b {
    @synchronized(self) {
        [self a];
    }
}
Run Code Online (Sandbox Code Playgroud)

对于后代而且因为我在阅读你的澄清之前已经输入了它,如果你真的只关心更新用户界面,你会想要强制你调用主线程,而不是这样:

- (void)someTask {
    dispatch_async( dispatch_get_main_queue(), ^{
        [self updateUI];
    });
}

- (void)updateUI {
    NSAssert( [NSThread isMainThread], @"called from non-main thread" );
    // do UI updates here
}
Run Code Online (Sandbox Code Playgroud)