CMMotionManager是一个全球资源?这意味着什么?

时间:2011-12-16 10:00:06

标签: iphone xcode4.2 core-motion

我正在尝试初始化CMMotionManager,因此启动更新并创建参考姿态矩阵,然后当我通过故事板单击按钮时,我显示不同的屏幕(在viewcontroller中),我想使用参考姿势矩阵和运动管理器的其他读数,但是如果我做一个简单的检查,看看它是否准备就好了(甚至认为它已在前一个屏幕上准备好了)。

所以我正在研究一下,我发现了一些标准说明它是一个全球资源,因此可以使用代表或类,这让我思考。

如果我使用委托,那么技术上资源的所有者正在为我做这个动作吗?所以它并不意味着它是全球性的。

课程怎么样?我尝试实现一个MotionManager类,但我仍然没有在第二个屏幕上得到任何读数...我只是没有在新屏幕上再次初始化它,因为我不希望同时运行多个实例。

为了解决我的问题我还假设我可以在主要问题中初始化一次,保存态度,在segue过渡中将其传递给下一个,然后重新初始化运动管理器,这样我只有1个实例(或关闭)屏幕上的旧屏幕将会消失。

但是我不想要这个,因为用户可能会立即点击屏幕,而运动管理器确实需要一点时间来初始化(或者我注意到的那些)。

提前感谢您提供的任何帮助。

修改

好的,我尝试了委托方法,但仍然无法在第二个窗口中从设备管理器中读取。我想到的是,当我要进入第二个窗口时,我可以自动释放我的运动管理器实例....(CMMotionManager)。

任何人都知道如何检查这个?

1 个答案:

答案 0 :(得分:2)

我希望我理解你。然后我建议在专门的类中使用封装运动管理器访问的单例设计模式。一些伪代码:

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并使调试更方便。

相关问题