在 Android 中,有几种方法可以在其他主线程中运行一些代码:
1. Activity.runOnUiThread(Runnable r)
2. new Handler.post(Runnable r);
3. View.post
iOS中的类似物是什么?
dispatch_async(dispatch_get_main_queue(), ^{
});
还有什么?
提前致谢。
在 Android 中,有几种方法可以在其他主线程中运行一些代码:
1. Activity.runOnUiThread(Runnable r)
2. new Handler.post(Runnable r);
3. View.post
iOS中的类似物是什么?
dispatch_async(dispatch_get_main_queue(), ^{
});
还有什么?
提前致谢。
现在首选的方法是使用 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:]
允许您通过任意代码(使用块)。
Swift 5+ 示例
DispatchQueue.main.async {
// UI code
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
// UI code
}