2017-01-25 19 views
0

私はアプリにジオロケーションを追加しています。ユーザーが実際に場所をリクエストする前に、観測可能なGeolocation.watchPostion()を開始する必要があります。ユーザアクションに応じてObservableのサブスクリプションを変更するにはどうすればよいですか?

私はインスタンス変数を作成

private locationObserver = (stub observer); 
private locationSubscription; 

this.locationSubscription = Geolocation.watchPosition().subscribe(
    next => this.locationObserver.next(next), 
    err => this.locationObserver.error(error), 
    comp => this.locationObserver.complete(complete) 
) 

を行い、その後、いくつかの後の時点で、次を呼び出すためのアイデアを持っていました。

onRequestLocation(){ 
    this.locationObserver = Observer.create(
    location => { 
     this.doMyStuff(location); 
     this.locationSubscription.unsubscribe(); 
    } 
) 
} 

ただし、これは正しい方法ではありません。これは悪いですか?

私の目標は、Geolocation.watchPosition()を開始してから、ユーザーイベントに応答して何かを開始することです。また、ユーザイベントの後にタイムアウトイベントが5秒間発生するようにしたいと思います。ここで

はまだ右感じていないもう一つの可能​​性である:

私はインスタンス変数

private userEventHasOccured 
private locationSubscription 

を作り、また

this.locationSubscription = Geolocation.watchPosition().subscribe(
    next => { 
    if (userEventHasOccured) { 
     this.doMyStuff(next); 
     this.unsubscribeLocation(); 
    } 
    } 
) 

public unsubscribeLocation() { 
    this.locationSubscription.unsubscribe(); 
} 

onUserEvent(){ 
    this.userEventHasOccured = true; 
} 

を行い、あなたはですeサブスクリプションを終了するのに邪魔になることはありませんか?

答えて

1

私の問題は理解不足でした。もちろん、オブザーバブルは複数のサブスクリプションを持つことができます。

編集:申し訳ありません。もう少し説明。

最後に、私の作業溶液は、インスタンス変数に

this.stubSubscription 
this.actualSubscription 

を宣言してから、それぞれ、ページの負荷、ユーザーの行動、およびページの休暇に次のように呼び出すことでした。

ionViewDidEnter() { 
    this.stubSubscription = Geolocation.watchPosition() 
    .subscribe(() => {},() => {}); 

onUserAction() { 
    this.actualSubscription = Geolocation.watchPosition() 
    .first(position => position.coords.accuracy <= 50) // 1st accurate-enough result 
    .subscribe(position => this.doMyStuff(position)) 

ionViewWillLeave() { 
    this.stubSubscription.unsubscribe(); 
    this.actualSubscription.unsubscribe(); 
} 

イオンは、ユーザーが離れるたびに実際にwilleaveを呼び出すと非常に良いようです。呼び出されなければ、ジオロケーションはアプリケーションが閉じられるまで実行され続けますが、これは悪いことです。私はこれをもっと反応的で、必然的ではない方法でやりたいと思っています...

編集2:私はこれを行うにはまだ最良の方法ではないと確信しています。お知らせ下さい!

+0

解決策(コード)を詳しくご記入ください。この現在の答えは、実際には十分な情報を提供していません。ありがとう! :) – Alex

+0

もちろん。私のソリューションは、同じ観察可能なもの、つまりそれを「開始」するものと、ユーザーの入力に応答するものとの2つのサブスクリプションを作成し、それらの両方をサブスクライブ解除してオブザーバブルを「停止」させることになりました。 –

+0

よく見えます!あなたは+1を得る;) – Alex

関連する問題