33

在 Android 中,有几种方法可以在其他主线程中运行一些代码:

 1. Activity.runOnUiThread(Runnable r)
 2. new Handler.post(Runnable r);
 3. View.post

iOS中的类似物是什么?

 dispatch_async(dispatch_get_main_queue(), ^{

    });

还有什么?

提前致谢。

4

2 回答 2

52

现在首选的方法是使用 GCD,并使用您在问题中引用的代码:

dispatch_async(dispatch_get_main_queue(), ^{
    // Your code to run on the main queue/thread
});

如果您更喜欢使用比 GCD 更面向对象的方法,您也可以使用NSOperation(如NSBlockOperation)并将其添加到[NSOperationQueue mainQueue].

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // Your code to run on the main queue/thread
 }];

这与 的作用完全相同dispatch_async(dispatch_get_main_queue(), …),其优点是比普通 C GCD 函数更面向 Objective-C/POO,但缺点是需要为创建NSOperation对象分配内存,而您可以使用普通 C 和GCD。


我推荐使用 GCD,但还有其他方法,比如允许您从主线程调用给定对象上的选择器(方法)的两种方法:

  • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait(NSObject 的方法,因此它可以在任何对象上调用)
  • 发送- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray *)modes[NSRunLoop mainRunLoop]

但是这些解决方案不如 GCD 灵活NSOperation,因为它们只允许您调用现有方法(因此您的对象必须有一个已经存在的方法并执行您想要执行的操作),而 GCD or-[NSOperationQueue addOperationWithBlock:]允许您通过任意代码(使用块)。

于 2012-10-13T17:32:07.017 回答
2

Swift 5+ 示例

DispatchQueue.main.async {
    // UI code
}


DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    // UI code
}
于 2021-02-08T21:00:43.950 回答