CMMotionManager 是全局资源吗?这是啥意思?
Posted
技术标签:
【中文标题】CMMotionManager 是全局资源吗?这是啥意思?【英文标题】:CMMotionManager is a global resource? What does this means?CMMotionManager 是全局资源吗?这是什么意思? 【发布时间】:2011-12-16 10:00:05 【问题描述】:我正在尝试初始化 CMMotionManager,以便开始更新并创建参考姿态矩阵,然后当我通过情节提要单击按钮时,我会显示不同的屏幕(位于视图控制器中)并且我想使用参考姿态矩阵和来自运动管理器的其他读数,但如果我做一个简单的检查,看看它是否准备好了,它说它没有(甚至认为它在前一个屏幕上已经准备好了)。
所以我进行了一些研究,发现一些斯坦福笔记说它是一种全球资源,因此可以使用委托或类,这让我开始思考。
如果我使用委托,那么从技术上讲,资源的所有者正在为我执行操作,对吗?所以这并不意味着它是全球性的。
课程呢?我尝试实现一个 MotionManager 类,但我仍然没有在第二个屏幕上得到任何读数......我只是没有在新屏幕上再次初始化它,因为我不想同时运行多个实例。
为了解决我的问题,我还假设我可以在主实例中初始化一次,保存姿态,在 segue 转换中将其传递给下一个,然后重新初始化运动管理器,因此我只有 1 个实例(或关闭屏幕上旧的会消失)。
但我不希望这样,因为用户可能会立即在屏幕上单击,并且运动管理器确实需要一些时间来初始化(或者这就是我注意到的)。
提前感谢您提供的任何帮助。
编辑:
好的,我尝试了委托方法,但我仍然无法从第二个窗口的设备管理器中读取。我想到的是,当我进入第二个窗口时,xcode 可能会自动释放我的运动管理器实例......(CMMotionManager)。
有人知道如何检查吗?
【问题讨论】:
【参考方案1】:我希望我对你的理解是正确的。然后我建议使用单例设计模式,将运动管理器访问封装在一个专门的类中。一些伪代码:
MotionHandler.h
@interface MotionHandler
CMMotionManager* motionManager;
+ (MotionHandler*) getInstance;
MotionHandler.c:
@interface MotionHandler
static MotionHandler* instance;
+ (MotionHandler*) getInstance
if (instance == nil)
instance = [[self alloc] init];
return instance;
- (id)init
if ((self = [super init]))
motionManager = [[CMMotionManager alloc] init];
// initialise CMMotionManager
所以只有一个 MotionHandler 实例来管理对 CMMotionManager 的访问。您可以使用MotionHandler.getInstance.motionManager
从任何地方访问您的CMMotionManager 实例。
如果您需要从多个类访问 CoreMotion,我建议完全封装 CMMotionManager 访问。这意味着将其设为 @private 并提供 getDeviceMotion、setReferenceAttitude 等方法... 这有助于避免启动两次或在启动前访问 CMDeviceMotion 等复杂情况,并使调试更方便。
【讨论】:
以上是关于CMMotionManager 是全局资源吗?这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
CMMotionManager 在 iOS 7 启动后返回偏航的大幅跳跃