Rup*_*ert 3 multithreading nsthread grand-central-dispatch cllocationmanager swift
根据文档 CLLocationManagerDelegate
从启动相应位置服务的线程中调用委托对象的方法。该线程本身必须具有活动的运行循环,就像在应用程序主线程中找到的那样。
我不清楚这是否意味着要在后台线程上接收位置管理器更新,我们必须在该后台线程上实例化位置管理器还是直接startUpdatingLocation()在该线程上调用方法。
无论如何,这解释了当a 从后台线程上启动时没有收到来自的任何事件时的问题:CLLocationManagerDelegateCLLocationManager
该线程本身必须具有活动的运行循环
如果我理解运行循环的功能正常,那么所有NSThreads运行循环都会实例化,但是只有在为线程分配一些工作后,运行循环才会运行。因此,要CLLocationManager在后台线程上正确发送事件,我们需要将线程的运行循环设置为永久循环,以便它可以在CLLocationManager调用到达时处理它们。
这个问题提出了一种确保运行循环正在运行的合理解决方案,但是作者暗示这是一种处理器昂贵的方式。
另外,根据线程文档,
就内存使用和性能而言,线程化会给您的程序(和系统)带来实际成本
我很欣赏我们都通过使用Grand Central Dispatch来使用大量线程,但是Grand Central Dispatch可能会减轻其内部线程管理中的许多麻烦。
所以我的第一个问题是,是否值得通过连续运行的运行循环设置后台线程,以便在后台线程上处理位置事件,或者与离开管理器相比,这会涉及不合理的额外处理量吗?在主线程上?
其次,如果值得的话,是否有使用Grand Central Dispatch进行此操作的好方法。据我了解的文档,Grand Central Dispatch管理自己的线程,而我们无法知道给定块将在哪个线程上执行。我想我们可以简单地执行通常的运行循环代码,以使我们CLLocationManager实例化的任何线程的运行循环都在循环中连续运行,但是这可能不会影响独立分配给Grand Central Dispatch的其他任务吗?
这是一个有点基于意见的问题,但是我对此有很强烈的意见:D
没有。
只需将事件传递到主队列,然后将所有工作分派到后台队列即可。其他任何事情都带来了很多复杂性,却没有什么好处。CLLocationManager早于GCD,所以在我们偶尔手动管理运行循环并从一个线程分派到另一个线程的日子里,这是有用的信息。GCD摆脱了大部分限制,绝对是您应该使用的工具。只需让GCD使用即可处理dispatch_async。
您绝对不应该NSThread为这种事情设置自己的东西。有时,它们仍然是与C ++交互所必需的,但是通常,如果GCD可以处理某些事情,则应允许它,并NSThread尽可能避免。
| 归档时间: |
|
| 查看次数: |
1174 次 |
| 最近记录: |