gpt4 book ai didi

objective-c - 在这种情况下,主队列/当前队列与主线程/后台线程之间的区别?

转载 作者:可可西里 更新时间:2023-11-01 06:23:37 26 4
gpt4 key购买 nike

我正在执行以下方法:

MotionHandler.m

-(void)startAccelerationUpdates
{
[motionManagerstartDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]withHandler:^(CMDeviceMotion *motion, NSError *error){.....}
}

在后台线程上,如下:

[currentMotionHandler performSelectorInBackground:@selector(startAccelerationUpdates) withObject:nil];

但上面的方法使用main Queue(在主线程上)来执行必要的更新,即使我在后台线程上调用它也是如此。所以正在执行加速更新在后台线程或主线程上,我很困惑..?

更有趣的是,当我再次在后台线程上调用上述方法时,但这次使用的是current Queue,我没有得到任何更新。有人可以解释一下运行某些东西的区别吗:

 1. a background thread but on the main queue

2. a background thread but on the current queue

3. the main thread but on the main queue

4. the main thread but on the current queue

在当前的实现中?谢谢!

最佳答案

我会试一试。首先,在没有被 NSOperationQueue 类引用告知的情况下,我们无法推断出“mainQueue”将在哪个线程上运行。阅读它我们看到实际上队列在 mainThread 上运行它的操作,即 UI 使用的线程,因此您可以在发布到该队列的操作中更新 UI。虽然没有说明,但这些操作必须是串行的,因为它们是由 runLoop 执行的(它们也有可能被抢占,不是 100% 确定)。

currentQueue 的目的是让正在运行的操作可以确定它们所在的队列,因此它们可以潜在地在该队列上排队新操作。

  1. 一个后台线程,但在主队列上

不可能 - NSOperation 的 mainQueue 总是与 mainThread 关联。

  1. 一个后台线程,但在当前队列中

当您创建一个 NSOperationQueue 并向其中添加 NSOperations 时,它们会在队列管理的后台线程上运行。任何给定的操作都可以查询它在哪个线程上,并且该线程在运行时不会改变。也就是说,该队列上的第二个操作可能会在不同的线程上运行。

  1. 主线程但在主队列上

见 1)

  1. 主线程但在当前队列中

如果您将一个操作排队到 mainQueue(我们知道它总是在 mainThread 上),并且您请求 currentQueue,它将返回 mainQueue:

[NSOperationQueue currentQueue] == [NSOperationQueue mainQueue];

关于objective-c - 在这种情况下,主队列/当前队列与主线程/后台线程之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12158793/

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