swift - 在后台线程上启动 `CLLocationManager` 是否明智?

标签 swift multithreading grand-central-dispatch cllocationmanager nsthread

根据CLLocationManagerDelegate的文档

The methods of your delegate object are called from the thread in which you started the corresponding location services. That thread must itself have an active run loop, like the one found in your application’s main thread.

我不清楚这是否意味着要在后台线程上接收位置管理器更新,我们必须在该后台线程上实例化位置管理器或简单地调用 startUpdatingLocation() 方法线程。

无论如何,这解释了当 CLLocationManagerDelegate 没有从在后台线程上启动的 CLLocationManager 接收任何事件时的 issue:

That thread must itself have an active run loop

如果我理解运行循环正常运行,所有 NSThreads 都用运行循环实例化,但运行循环只有在您为线程分配一些工作时才会运行。因此,要让 CLLocationManager 在后台线程上正确发送事件,我们需要将线程的运行循环设置为永久循环,以便它可以处理 CLLocationManager 的调用他们到了。

this 问题中提出了确保运行循环正在运行的合理解决方案,但作者暗示这是一种处理器开销很大的方法。

另外,根据线程 documentation

Threading has a real cost to your program (and the system) in terms of memory use and performance

我很欣赏无论如何我们都在使用大量线程,通过使用 Grand Central Dispatch,但 Grand Central Dispatch 可能在其内部线程管理中减轻了很多这种情况。

所以我的第一个问题是,是否值得设置一个具有连续运行循环的后台线程,以便在后台线程上处理位置事件,或者这是否会涉及不合理的额外处理量与将管理器留在主线程相比,什么时候?

其次,如果值得,是否有使用 Grand Central Dispatch 执行此操作的好方法。据我了解 documentation ,Grand Central Dispatch 管理自己的线程,我们无法知道给定 block 将在哪个线程上执行。我想我们可以简单地执行通常的运行循环代码,使我们的 CLLocationManager 实例化的任何线程的运行循环连续循环运行,但这可能不会影响独立分配给 Grand Central Dispatch 的其他任务吗?

最佳答案

这是一个有点基于意见的问题,但我对此有很强的意见:D

没有。

只需将事件传送到主队列,并将任何工作分派(dispatch)到后台队列(如果它很重要)。任何其他事情都会带来很多复杂性,但收效甚微。 CLLocationManager 早于 GCD,因此在我们偶尔手动管理运行循环并且从一个线程分派(dispatch)到另一个线程很痛苦的日子里,这是有用的信息。 GCD 摆脱了其中的大部分,绝对是您应该为此使用的工具。只需让 GCD 使用 dispatch_async 处理即可。

你绝对不应该为这种事情设置你自己的NSThread。它们有时仍然是与 C++ 交互所必需的,但通常如果 GCD 可以处理某些事情,你应该让它处理,并尽可能避免使用 NSThread

关于swift - 在后台线程上启动 `CLLocationManager` 是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43685085/

相关文章:

ios - 从 Firebase 请求接收值后调用函数

ios - Firebase - 如何获取 observeEventType = Value 中的键值

multithreading - GHC 的 thunk 有多原子?

swift - GCD swift 4 线程安全

objective-c - 在为 UIView 设置动画时阻止串行调度队列

swift - 变量中的变量

ios - 在 Swift 中使旋转真实地停止

objective-c - dispatch_async 与 beginBackgroundTaskWithExpirationHandler

Python - BaseHTTPServer.HTTPServer 并发和线程

objective-c - 如何在非 ARC 世界中使用 NSMutableDictionary 避免 EXC_BAD_ACCESS?