gpt4 book ai didi

ios - 确保我正确解释了嵌套 GCD

转载 作者:行者123 更新时间:2023-12-01 17:49:43 28 4
gpt4 key购买 nike

因此,我使用 dispatch_async 将 10 个任务放入并发队列中。它们不会阻塞下一个任务,并按顺序处理。我的 UI 具有响应能力。

for (int i = 0; i < 10; i++) {

dispatch_async(concurrencyQueue, ^() {

NSLog(@"..calling insertion method to insert record %d", i);

dispatch_sync(serialQueue, ^() {

//this is to simulate writing to database
NSLog(@"----------START %d---------", i);
[NSThread sleepForTimeInterval:1.0f];
NSLog(@"--------FINISHED %d--------", i);

});

});
}

在每个任务中,我们通过dispatch_sync串行队列上模拟“1秒 sleep ”写入数据库。

我一直认为dispatch_sync会阻止每个人,并同步其任务,因为这就是我单独使用它时的行为方式。但是,在这种情况下,它不会阻塞主线程。相反,它会像我想要的那样在后台完美运行。

是否是因为与队列关联的任何线程都受到了影响?

例如,主线程通过dispatch_async执行并发队列,这就是它不会被阻塞的原因。

dispatch_sync 仅同步和阻塞在并发队列上工作的后台线程。因此,dispatch_sync 与后台线程关联,因此永远不会影响我的 UI 主线程。

我的想法正确吗?

谢谢!

最佳答案

您永远不会阻塞主线程,因为您的代码在 concurrencyQueue 的线程或 serialQueue 的线程上运行。这些都不是主线程。

所有对 sleep 的调用都在 serialQueue 的线程上一一发生。所以是serialQueue的线程被阻塞了。

但是,由于您使用 dispatch_sync 分派(dispatch)到 serialQueue,因此您还会阻塞并发队列的每个线程。如果您在调用 dispatch_sync 之后添加另一个 NSLog,效果会更好。

for (int i = 0; i < 10; i++) {
dispatch_async(concurrencyQueue, ^() {
NSLog(@"..calling insertion method to insert record %d", i);

dispatch_sync(serialQueue, ^() {
//this is to simulate writing to database
NSLog(@"----------START %d---------", i);
[NSThread sleepForTimeInterval:1.0f];
NSLog(@"--------FINISHED %d--------", i);
});

NSLog(@"..called insertion method to insert record %d", i);
});
}

dispatch_sync 之后的第二个 NSLog 将更好地向您展示 dispatch_sync 如何影响对 dispatch_async 的调用.

关于ios - 确保我正确解释了嵌套 GCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34827677/

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