問題タブ [reactive-cocoa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - ReactiveCocoaでキャンセル可能なタイムアウト
iOSでReactiveCocoaを使用してカウントダウンタイマーを実装したいと思います。タイマーはX秒間実行され、毎秒何かを実行する必要があります。私が理解できない部分は、タイムアウトをキャンセルする方法です。
cocoa - ReactiveCocoaを使用してAPI呼び出しを行う前に透過的に認証するにはどうすればよいですか?
リモートWebAPIを呼び出すアプリでReactiveCocoaを使用しています。ただし、特定のAPIホストから何かを取得する前に、アプリはユーザーの資格情報を提供し、APIトークンを取得する必要があります。このトークンは、後続のリクエストに署名するために使用されます。
この認証プロセスを抽象化して、API呼び出しを行うたびに自動的に行われるようにします。ユーザーの資格情報を含むAPIクライアントクラスがあると仮定します。
ReactiveCocoaを使用して、APIへの最初の(そして最初の)リクエストを透過的に取得し、副作用として、後続のリクエストが行われる前にAPIトークンを安全に保存するにはどうすればよいですか?
combineLatest:
また、複数の同時リクエストを開始するために使用(または同様)できること、およびトークンが取得されるのをすべて暗黙的に待機することも要件です。
さらに、API呼び出しが行われたときに、retrieve-token要求がすでに実行中である場合、そのAPI呼び出しは、retrieve-token要求が完了するまで待機する必要があります。
私の部分的な解決策は次のとおりです。
基本的なパターンはflattenMap:
、トークンを生成するシグナルを、トークンが与えられると、目的のリクエストを実行し、API呼び出しの結果を生成するシグナルにマッピングするために使用されます。
いくつかの便利な拡張機能を想定していますNSURLRequest
:
次に、のサブスクリプション実装について考えてみます-getToken
。
- 些細なケースでは、トークンがすでに取得されている場合、サブスクリプションはすぐにトークンを生成します。
- トークンが取得されていない場合、サブスクリプションはトークンを返す認証API呼び出しを延期します。
- 認証API呼び出しが実行中の場合は、認証API呼び出しをネットワーク上で繰り返さずに、別のオブザーバーを追加しても安全です。
ただし、これを行う方法がわかりません。また、トークンを安全に保管する方法と場所は?ある種の永続的/反復可能な信号?
cocoa - ReactiveCocoa の参照所有権のセマンティクスは何ですか?
シグナルを作成して関数のスコープに入れると、有効な保持カウントは Cocoa の規則に従って 0 になります。
シグナルをサブスクライブすると、サブスクライバーが保持され、Cocoa の規則に従って保持カウントがゼロの使い捨てが返されます。
ほとんどの場合、サブスクライバーは閉じて、self
またはその ivar またはそれを囲むスコープの他の部分を参照します。したがって、シグナルをサブスクライブすると、シグナルにはサブスクライバーへの所有参照があり、サブスクライバーにはあなたへの所有参照があります。そして、見返りに得られる使い捨てには、シグナルへの所有参照があります。
ある時点でサブスクリプションをキャンセルできるように、使い捨てを保持しているとします (たとえば、シグナルが Web サービスからデータを取得していて、ユーザーが画面から離れて、取得中のデータを表示する意図をキャンセルした場合)。
この時点で、循環参照があります。
責任を持って行うべきことは、リクエストをキャンセルするとき、またはリクエストが完了した後にサイクルが壊れていることを確認することです。
self
の割り当てが解除されているときはこれを行うことができないことに注意してください。サブスクライバーへのコールバック中に保持サイクルを中断することについても、何か怪しいように見えます。これは、その実装がまだコール スタック上にある間にシグナルが割り当て解除される可能性があるためです。
また、実装がアクティブなシグナルのプロセスグローバルリストを保持していることにも気付きました(最初にこの質問をしている時点で)。
RAC を使用する場合、所有権についてどのように考える必要がありますか?
ios - サブスクライバーがいない場合は公開を停止し、サブスクライバーがいる場合は自動開始します
RACSignal
サブスクライバーがいない場合は公開を停止し、サブスクライバーがいる場合は自動開始するを実装するにはどうすればよいですか?
シナリオは次のとおりです。
currentLocationSignal
にがあるとしましょうAppDelegate
。LocationViewController
ビューがロードされるときにサブスクライブし、currentLocationSignal
ビューがアンロードされるときにサブスクライブを解除(破棄)します。現在地を取得するのに数秒かかるのでcurrentLocationSignal
、アプリが開いたときに常にサブスクライブしたいので(そして数秒後に自動登録解除)、到着するまでLocationViewController
に正確な位置を取得します。したがって、信号には複数のサブスクライバーが存在する可能性があります。最初のサブスクライバーがリッスンするときは呼び出しを開始する必要startUpdatingLocation
があり、サブスクライバーがいないときは呼び出す必要がありますstopUpdatingLocation
。
objective-c - RACReplaySubject と RACMulticastConnection をいつ使用するか?
ReactiveCocoaを使用すると、値を生成する操作を再トリガーするのではなく、シグナルから同じ値をサブスクライバーに受信させる方法が 2 つあるようです: RACReplaySubject または RACMulticastConnection 経由。
RACReplaySubject のヘッダー ドキュメントは次のとおりです。
リプレイ サブジェクトは、送信された値を (定義された容量まで) 保存し、それらを新しいサブスクライバーに再送信します。また、エラーまたは完了を再生します。
RACMulticastConnection の場合:
マルチキャスト接続は、信号への 1 つのサブスクリプションを多くのサブスクライバーに共有するという考えをカプセル化します。これは、基になるシグナルへのサブスクリプションに副作用が伴う場合、または複数回呼び出す必要がない場合に最も頻繁に必要になります。
-[RACMulticastConnection connect]
マルチキャストされたシグナルは、が呼び出されたときにのみサブスクライブさ れます。それが起こるまで、値は に送信されませんsignal
。を自動的に呼び出す-[RACMulticastConnection autoconnect]
方法について は、を参照してください。-[RACMulticastConnection connect]
RACMulticastConnection を手動で作成しないでください。代わりに
-[RACSignal publish]
またはを使用します-[RACSignal multicast:]
。
RACReplaySubject または RACMulticastConnection をいつ使用するかについて、誰かが簡単なガイドラインを提供できますか?
ios - 複数の UIControl を使用した RACSignal CombineLatest
Reactive Cocoaを試していますが、複数の UIControl からの信号を組み合わせるのに問題があります。
UIEdgeInsets のエディターを作成しており、上、左、下、右のインセット用に 4 つの UISteppers があります。
私がやりたいことはこれです:
ただし、これによって信号が処理されることはありません。
次のように、シグナルを 1 つだけ含める場合:
期待どおりに動作します (他のステッパーが個別に正常に動作することを観察することもできます) が、複数のコントロールの場合は何も得られません。各コントロールを個別のシグナルとして観察することで回避できますが、それではcombineLatest
メソッドの要点を見逃しているようです。何か間違ったことをしていますか、それとも RAC プロジェクトで問題を提起する必要がありますか?
ios - シグナルを1回だけ受信し、それ自体をサブスクライブ解除/解放するReactiveCocoaサブスクライバーを作成するにはどうすればよいですか?
私は現在、次のようなプロパティシグナルにサブスクライバーを登録しています。
デフォルトの機能では、self.testが変更されるたびに起動しますが、一度起動してから登録を解除したいだけです。このサブスクライバーを作成するときにRACに渡すことができる「1回」の引数または修飾子はありますか?
ios - 非同期ネットワーク操作で RACCommand を使用する
UAGitHubEngine
GitHub の API にアクセスするために使用しています。いくつかのデータを取得するために、機能的なリアクティブ アプリを作成したいと考えています。非同期ネットワーク リクエストをセットアップするために、ここのコードに依存しています。私が探しているのは、「General」という名前のチームのチーム ID です。フィルタリング/印刷の部分はOKです:
しかし、コマンドの設定は私にとって謎です:
非同期ネットワーク呼び出しが返されたときにイベントをプッシュするシグナルを返すようにシグナル ブロックを設定するにはどうすればよいですか?
ios - ReactiveCocoa での依存シグナルの連鎖
ReactiveCocoa では、いくつかの従属シグナルをチェーンする場合subscribeNext:
、チェーン内の次のシグナルを使用して、以前に生成されたシグナル (たとえば、非同期操作の結果) の値を受け取る必要があります。しばらくすると、コードは次のようになります (不要な詳細は省略されています)。
この増え続けるネストは、ドキュメントに記載されている非反応的な例よりもはるかに良く見えません。
何か不足していますか?ReactiveCocoa に依存する作業をチェーンするより良いパターンはありますか?