performSelectorOnMainThread的阻止版本:withObject:waitUntilDone:

时间:2012-02-21 18:46:07

标签: objective-c multithreading concurrency event-handling objective-c-blocks

有没有办法可以执行一个块而不是一个对应于这个和类似方法的选择器?

我有观察者可能会收到主线程上没有生成的事件。我想要在主线程上执行操作,如果它主要是面向UI的。现在,我需要编写两个方法来执行此操作,其中一个是事件观察者,第二个是需要在主线程上执行的代码。

如果可以的话,我想把这一切都封装到一个方法中。

2 个答案:

答案 0 :(得分:13)

GCD应该这样做:

dispatch_sync(dispatch_get_main_queue(), ^{
    // Do stuff here
});

如果您计划dispatch_async,请waitUntilDone:NO。要在主线程上运行的main queue is guaranteed,因此对于UI操作是安全的。

答案 1 :(得分:12)

块支持多线程操作的首选技术称为Grand Central Dispatch。您可以在WikipediaGrand Central Dispatch (GCD) Reference

中找到一些示例代码
dispatch_async(backgroundQueue, ^{
        //background tasks

        dispatch_async(dispatch_get_main_queue(), ^{
            //tasks on main thread
        });    
});