gpt4 book ai didi

objective-c - 分派(dispatch)到主队列总是失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:50:38 27 4
gpt4 key购买 nike

我正在尝试通过 iOS 上的 GCD 将一些代码分派(dispatch)到主队列,但即使是最简单的测试也总是失败。最后归结为:

static const int TICK_INTERVAL = 1;

#pragma UIApplicationDelegate implementation

- (void) doTick
{
if (![NSThread isMainThread])
{
NSLog(@"Trying to dispatch . . .");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"test . . .");
});
}
}

- (void) startUpdate
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

timer_ = [NSTimer
scheduledTimerWithTimeInterval:TICK_INTERVAL
target:self
selector:@selector(backgroundUpdate)
userInfo:nil
repeats:NO
];

[[NSRunLoop currentRunLoop]
addTimer:timer_
forMode:NSRunLoopCommonModes
];

[[NSRunLoop currentRunLoop] run];
});

UIBackgroundTaskIdentifier back =
[[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
[self doTick];
[[UIApplication sharedApplication]
endBackgroundTask:back
];
}];
}

-(void)backgroundUpdate
{
[self doTick];

UIBackgroundTaskIdentifier back =
[[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
[self doTick];
[[UIApplication sharedApplication]
endBackgroundTask:back
];
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
timer_ = [NSTimer
scheduledTimerWithTimeInterval:TICK_INTERVAL
target:self
selector:@selector(backgroundUpdate)
userInfo:nil
repeats:NO
];

[[NSRunLoop currentRunLoop]
addTimer:timer_
forMode:NSRunLoopCommonModes
];

[[NSRunLoop currentRunLoop] run];
});
}

- (id) init
{
self = [super init];
[self startUpdate];
return self;
}

那是我的 AppDelegate。我希望 NSLog 在主线程中执行以记录上面的测试文本,但没有任何反应。 dispatch_sync 代码一直在等待,我放置在 block 中的断点永远不会到达。

我确保代码不在主线程中执行。在使用 dispatch_sync 进行测试之前,我在我的应用中尝试了 dispatch_async,当然,结果基本相同:没有任何反应(没有阻塞)。

有趣的是,它似乎不适用于主队列,其他队列(当前队列、全局队列)似乎工作得很好。

我正在我的应用程序中使用 Phonegap (Cordova),如果它有任何意义的话。

有什么想法吗?

非常感谢!

最佳答案

永远不要dispatch_sync 从队列上执行的任务到同一个队列。这肯定会在任何串行队列(如主队列)上发生死锁,并且在并发队列上是个坏主意。参见 Apple's Concurrency Programming Guide更多细节。由于应用程序委托(delegate)的 init 方法在主线程上运行,dispatch_sync 到主队列会导致死锁。

dispatch_async 到主队列只要您在主线程上运行正常的 NSRunLoop 就可以工作。当然,您的 NSLog(@"test . . .") 可能会比您的应用程序委托(delegate)的 init 方法完成后执行。

关于objective-c - 分派(dispatch)到主队列总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965626/

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