2017-09-23 4 views
-1

私は客観的なことを自分で学びました。したがって、iOSアプリを書いているうちに、ちょっとしたことで混乱することもあります。この質問は非常に不自由かもしれませんが、解決策が見つからないか、解決策を理解できませんでした。ここに私の状況です:iOSで値を継続的に更新するメインビューコントローラーのユーザー定義メソッドを作成するにはどうすればいいですか?

私のアプリには、シングルビューコントローラ(デフォルトのもの)が含まれています。私は、加速度計、ジャイロスコープ、磁力計から連続的な値を取得し、その値を歩行者推測航法(PDR)を使ってユーザーの位置を推定するために使用したいと考えています。この目的のために、私はCoreMotionを使用し、ヘッダーファイルにCLMotionManager(motionManager)プロパティを作成しました。このマネージャを使用して、私は例えば、センサが利用可能であるかどうかをチェックし、その値を取得することができます:

if([_motionManager isAccelerometerAvailable]) 
{ 
    _motionManager.accelerometerUpdateInterval = 0.1; 
    [_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) { 
      x=accelerometerData.acceleration.x; 
      y = accelerometerData.acceleration.y; 
      z = accelerometerData.acceleration.z; 

    }];} 

同様に、私はジャイロスコープと磁力計から値を取得することができます。 )

1:PDR操作のように私の次の方法で行わ

-(IBAction)startSensor:(id)sender 
{ 
//Getting accelerometer, gyroscope, and magnetometer values. 
} 

-(void)thePDROperationWith:(NSArray*)accelerometerValues gyroscopeValues:(NSArray*)gyros magnetometerValues:(NSArray*)magneto 
{ 
//The PDR operations with accelerometer, gyroscope and magnetometer values 
} 

、私の質問があり、私はとボタンを押した後IBActionメソッド内でこれらの値を取得しますthePDROperationWith:: メソッドから連続PDR操作値を取得する方法は?私はstartSensorメソッドの中でこのメソッドを呼び出しましたが、私は ボタンを押したときに一度だけ値を取得します。また、私は もヘッダファイルにこのメソッドを宣言すると思います(ユーザ定義のNSObjectサブクラスのように)?

2)

//a method in CLBeaconManager delegate -(void)beaconManager:(CLBeaconManager*)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { //code }のようなユーザー定義のメソッドとデリゲートメソッドの違いは何ですか?

定義されたCLBeaconRegionのビーコンを範囲指定するために、このデリゲートメソッド(私は正しい用語を使用しています)が連続して実行されます。私の目的のためにそのような方法を作ることができますか?

ありがとうございます。

答えて

1

startAccelerometerUpdatesToQueue名前が言うことは何ですか - 加速度計の更新方法のシーケンスを開始し、指定されたキュー(あなたの場合は任意のバックグラウンドキュー)上でそれらをあなたに伝えます。

したがって、現在値をx,yおよびzに保存しているコードは、OSが加速度計の変化を検出するたびに実行されます。あなたはジャイロスコープと磁力計から来る永久的な更新の同様のシーケンスを持っている可能性があります。

これらの情報ストリームは、更新のトリガーになる可能性があります。新しい加速度計、ジャイロスコープまたは磁力計のアップデートが到着するたびに、知識を更新してください。

(これらの3つのそれぞれについて別々のキューを作成している場合は、別のスレッドでそれらを処理する可能性が高いため、同時データアクセスについて心配する必要があります。または、[NSOperationQueue mainQueue]を使用して、すべての更新を同じキュー(UIKitが動作するもの)で受け取るようにすることができます。

デリゲートメソッドは、あるクラスが別のクラスに委譲する関数を表すメソッドです。この場合、ビーコンマネージャはビーコンを追跡する方法を知っているが、このアプリケーションでは追跡されたビーコンの結果として適切なものは知っていない。したがって、ビーコンの変更から流れる決定を委任します。

のObjective-Cは、古いコードを見ている場合は、いくつかの非常に非公式なアプローチが表示される場合がありますので、あなたはこれらの事については本当に緩いことができますが、最近は通常の方法は、例えば、デリゲートプロトコルを宣言することです:

@class MyClass; // Declare that there is a class called MyClass. 

// Define a protocol for delegates. 
@protocol MyProtocol 
- (void)thisClass:(MyClass *)class learntFact:(Fact *)fact; 
@end 

// Here's MyClass for real 
@interface MyClass 
@property(nonatomic, weak) id<MyProtocol> factDelegate; 
@end 

その後MyClassのインスタンスは、それだけでデリゲートを伝え言いたいことがある場合:

[self.factDelegate thisClass:self learntFact:...fact here...]; 

をデリゲートになりたい、誰かが、関連するプロトコルの発表された支持体を有する、instanceOfMyClass.factDelegate = selfを設定します。

関連する問題