gpt4 book ai didi

multithreading - 比较 GCD 与 performSelectorInBackground : dispatch_async not in background

转载 作者:行者123 更新时间:2023-12-04 13:05:33 24 4
gpt4 key购买 nike

Grand Central Dispatch 很棒并且减少了代码量,但是为什么我不能在后台线程上运行某些东西?
我制作了一个示例应用程序来展示我的意思(没有评论的作品):

- (IBAction)performSel {
[self performSelectorInBackground:@selector(doStuff) withObject:nil];
[NSThread sleepForTimeInterval:3];
[[self.view.subviews lastObject] removeFromSuperview];
}

- (IBAction)gcd {
dispatch_async(dispatch_queue_create("myGCDqueue", NULL), ^(void) {
//dispatch_sync(dispatch_queue_create("myGCDqueue", NULL), ^(void) {
//dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
//dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
//dispatch_async(dispatch_get_main_queue(), ^(void) {
//dispatch_sync(dispatch_get_main_queue(), ^(void) {
[self doStuff]; // only for readability, will move the code on success
});
[NSThread sleepForTimeInterval:3];
[[self.view.subviews lastObject] removeFromSuperview];
}

- (void)doStuff {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

UIView *abortingView = [[UIView alloc]initWithFrame: self.view.bounds];
abortingView.backgroundColor = [UIColor whiteColor];
abortingView.alpha = 0.7;
[self.view insertSubview:abortingView atIndex:10];
[abortingView release];

[pool drain];
}
[NSThread sleepForTimeInterval:3];是模拟默认的 UI 功能。例如,如果有人从一个导航 View 切换到另一个。
只需在基于 View 的新应用程序中复制代码,创建两个按钮并将它们连接起来。

最佳答案

UIKit 类只能在应用程序的主线程中使用。 (从 iOS4 开始,绘制到图形上下文是线程安全的。)您不能在后台线程中使用 UIKit 的东西。

因此,在这种情况下,您只能使用 dispatch_async(dispatch_get_main_queue(), block) 。

dispatch_async(dispatch_get_main_queue(), ^(void) {

它将在主线程的 runloop 中调用主线程上的块。
dispatch_async(dispatch_queue_create("myGCDqueue", NULL), ^(void) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {

它将在后台线程中调用该块。你不能使用它,因为你想在块中使用 UIKit。小心 dispatch_async(dispatch_queue_create( ,可能会导致内存泄漏,需要释放dispatch_queue_create创建的串行队列。
dispatch_sync(dispatch_queue_create("myGCDqueue", NULL), ^(void) {
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {

dispatch_sync 等待块完成。
dispatch_sync(dispatch_get_main_queue(), ^(void) {

它会导致死锁。

关于multithreading - 比较 GCD 与 performSelectorInBackground : dispatch_async not in background,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com