2011-12-16 10 views
1

CMMotionManagerを初期化して更新を開始し、参照姿勢行列を作成しようとしていますが、ストーリーボードのボタンをクリックすると、別の画面(viewcontrollerにあります)が表示され、参照姿勢行列やモーションマネージャーからの他の読み取り値が表示されますが、準備が整っていないかどうかを確認するために単純なチェックを行うと(前の画面で準備ができているとはいえ)CMMotionManagerはグローバルリソースですか?これはどういう意味ですか?

私はちょっと研究していました。スタンドフォードのノートをいくつか見てきました。グローバルリソースだと言って、デリゲートやクラスを使っても構わないと思っていました。

私はデリゲートを使用すると、リソースの所有者が技術的に私のためのアクションを行っていますか?それは本当にそれがグローバルであることを意味しません。

クラスについてはどうですか?私はMotionManagerクラスを実装しようとしましたが、私はまだ2番目の画面上の任意の読み取り値を取得していない...と私は同時に複数のインスタンスruningをしたくないため、新しい画面でそれを再度初期化しませんでした。

私の問題を解決するために、私はメインのもので一度初期化し、姿勢を保存して、次のセグエートランジションに渡してモーションマネージャーを初期化し直して、画面上の古いものを閉じると消える)。

しかし、ユーザーが画面上をすぐにクリックする可能性があり、モーションマネージャーが初期化するのに少し時間がかかります(または気づいたもの)。

お手数ですがお寄せいただきありがとうございます。

EDIT:

[OK]を私は、デリゲートメソッドを試みたと私はまだ第二ウィンドウのデバイスマネージャから読み出さ傾けます。頭に浮かぶのは、私が2番目のウィンドウに行くときのMAYBEです.xcodeは、自動的にMotion Manager ....(CMMotionManager)のインスタンスを解放しています。

誰かがこれを確認する方法を知っていますか?

答えて

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 
     } 
    } 
} 

のでCMMotionManagerへのアクセスを管理するだけMotionHandlerの1件のインスタンスがあります。 MotionHandler.getInstance.motionManagerでどこからでもCMMotionManagerインスタンスにアクセスできます。

複数のクラスからCoreMotionにアクセスする必要がある場合は、CMMotionManagerのアクセスを完全にカプセル化することをお勧めします。つまり、それを@privateにしてgetDeviceMotion、setReferenceAttitudeなどのメソッドを提供することを意味します。 これは、開始前に2回の起動やCMDeviceMotionへのアクセスなどの複雑さを回避し、デバッグをより便利にします。

関連する問題