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 启动后返回偏航的大幅跳跃

CMMotionManager 未提供任何值

CMMotionManager 的多个实例,确定更新间隔

CMMotionManager 的委托方法

Swift 3 CMMotionManager startGyroUpdates 不起作用

熊猫不进口吗? 'NameError:未定义全局名称'pandas''