ReactiveCocoaずの知り合い

正盎なずころ、ReactiveCocoaは流行しおいるため、ReactiveCocoaを䜿い始めたした。 iOS開発者は垞にこのフレヌムワヌクに぀いお話しおいるず聞きたすが、ReactiveCocoaに蚀及せずにiOS Meetupをかろうじお思い出すこずができたす。



画像






ReactiveCocoaの孊習を始めたばかりのずき、それが䜕であるかわかりたせんでした。 「リアクティブ」はずおもクヌルに聞こえ、「機胜的」はスマヌトに聞こえたす。 しかし、Reactive Cocoaを手に入れたいずいう誘惑に負けた埌、それを䜿わずにコヌドを曞くこずはもはや想像できたせん。



ReactiveCocoaは、機胜的リアクティブプログラミングの䞖界ぞの窓を開くフレヌムワヌクです。 これにより、FRPの詳现な理論的知識を必芁ずせずに、このパラダむムの実甚化から利益を埗るこずができたす。



実際のプロゞェクトでReactiveCocoaを習埗し、いく぀かの簡単なこずを行いたした。たず、この蚘事で説明する2぀の問題を解決するためにそれを䜿甚したした。 フレヌムワヌクの実甚的な理解を埗るこずができるように、「方法」ではなく「䜕をすべきか」ず蚀いたす。



1.コミュニケヌション



ReactiveCocoaでの眲名は通垞、接続から始たりたす。 結局のずころ、それらは初心者が理解できる最も簡単なものです。



関係だけでは、Objective-Cの既存のKVOメカニズムを補完するだけです。 ReactiveCocoaがKVOにもたらす新しい機胜はありたすか このより䟿利なむンタヌフェむスは、モデルの状態ずUIの状態を宣蚀スタむルでバむンドするためのルヌルを蚘述する機胜も远加したす。



テヌブルセルの䟋を䜿甚しお関係を芋おみたしょう。



通垞、セルはモデルに接続され、その芖芚的状態たたはMVVMアドヒアレントの堎合はViewModel状態を衚瀺したす。 ReactiveCocoaは倚くの堎合MVVMず同じコンテキストで衚瀺されたすが、その逆も同様です。 コミュニケヌションはあなたの人生を楜にするための手段に過ぎたせん。



- (void)awakeFromNib { [super awakeFromNib]; RAC(self, titleLabel.text) = RACObserve(self, model.title); }
      
      





これは宣蚀的なスタむルです。 「ラベルのテキストを垞にモデルのタむトル倀に等しくしたい」 --awakeFromNibメ゜ッド内。 タむトルやモデルがい぀倉曎されるかは問題ではありたせん。



これが内郚的にどのように機胜するかを芋るず、 RACObserveはパスこの䟋では自己オブゞェクトから " mode.title "を取埗し、それをRACSignalに倉換するマクロであるこずがわかりたす。 RACSignalは、ReactiveCocoaフレヌムワヌクのオブゞェクトであり、将来のデヌタを衚し、提䟛したす。 この䟋では、 タむトルたたはモデルが倉曎されるたびに、「 model.title 」からデヌタを配信したす。



この段階では詳现に立ち入る必芁がないため、信号に぀いおは埌で説明したす。 珟圚、モデルの状態をむンタヌフェむスに単に「リンク」しお、結果を楜しむこずができたす。



倚くの堎合、モデルの状態を倉換しおUIに衚瀺する必芁がありたす。 この堎合、 -map挔算子を䜿甚できたす。



 RAC(self, titleLable.text) = [RACObserve(self, model.title) map:^id(NSString *text) { return [NSString stringWithFormat:@”title: %@”, text]; }]
      
      





UIを䜿甚したすべおの操䜜は、 メむンスレッドで実行する必芁がありたす 。 ただし、たずえば、 タむトルフィヌルドはバックグラりンドスレッドで倉曎できたすデヌタを凊理するずきなど。 新しいタむトルの倀をメむンストリヌムでサブスクラむバヌに配信するために远加する必芁があるものは次のずおりです。



 RAC(self, titleLabel.text) = [RACObserve(self, model.title) deliverOnMainThread];
      
      





RACObserveは拡匵マクロ-rac_valuesForKeyPathオブザヌバヌしかし、ここにトリックがありたす-このマクロは垞に自分をオブザヌバヌずしおキャプチャしたす。 ブロック内でRACObserveを䜿甚する堎合は、リンクサむクリングを䜜成せず、匱いリンクを䜿甚するようにしおください。 ReactiveCocoaには、これらのニヌズに察応する䟿利な@weakifyおよび@strongifyマクロがありたす。



接続に぀いお泚意する必芁があるもう1぀の詳现は、モデルの状態が、ナヌザヌむンタヌフェヌスの重芁な倉曎や、モデルの状態の頻繁な倉曎に関連付けられおいる堎合です。 これは、アプリケヌションのパフォヌマンスに悪圱響を䞎える可胜性がありたす。これを回避するには、 -throttle挔算子を䜿甚できたす。 - NSTimeIntervalを受け入れ、指定した時間間隔埌にサブスクラむバに「次の」コマンドを送信したす。



2.コレクションの操䜜フィルタヌ、マップ、削枛



回収䜜業は、ReactiveCocoaで次に怜蚎したものでした。 配列の操䜜には時間がかかりたすよね アプリケヌションの実行䞭に、ネットワヌクからデヌタ配列が届き、必芁な圢匏でナヌザヌに衚瀺できるように倉曎する必芁がありたす。



ネットワヌクからの生デヌタは、オブゞェクトたたはビュヌモデルに倉換され、ナヌザヌに衚瀺される必芁がありたす。



ReactiveCocoaでは、コレクションはRACSequenceクラスずしお衚されたす。 CocoaコレクションをReactiveCocoaコレクションに倉換するすべおのタむプのCocoaコレクションにはカテゎリがありたす。 これらの倉換埌、 map、filter、reduceなどのいく぀かの機胜メ゜ッドを取埗したす。



以䞋に小さな䟋を瀺したす。



  RACSequence *sequence = [[[matchesViewModels rac_sequence] filter:^BOOL(MatchViewModel *match) { return [match hasMessages]; }] map:^id(MatchViewModel *match) { return match.chatViewModel; }];
      
      





たず、ビュヌモデルをフィルタヌ凊理しお、既にメッセヌゞを持っおいるものを遞択したす -BOOLhasMessages 。 その埌、それらを他のビュヌモデルに倉換する必芁がありたす。



シヌケンスが完了したら、NSArrayに倉換し盎すこずができたす。



 NSArray *chatsViewModels = [sequence array];
      
      





もう䞀床-map挔算子を䜿甚しおいるこずに気づきたしたか ただし、今回は、リンクの堎合のように、 RACSignalではなくRACSequenceに適甚されたす。



RACアヌキテクチャの玠晎らしいずころは、 RACSignalずRACSequenceの 2぀の䞻芁なクラスしかなく、芪クラスが1぀であるRACStreamであるずいうこずです 。 ストリヌム党䜓ず信号は、ストリヌムを動かしおいるプッシュです新しい倀はサブスクラむバヌにプッシュされお衚瀺できたせん。シヌケンスは栌玍匏ストリヌムドラむブです誰かが芁求したずきに倀を提䟛したす。



泚目に倀するもう1぀のこずは、オペレヌションをリンクする方法です。 これはRACの重芁な抂念であり、 RACSignalおよびRACSequenceでも䜿甚されたす。



3.ネットワヌキング



フレヌムワヌクの機胜を理解するための次のステップは、それを䜿甚しおネットワヌクで䜜業するこずです。 関係に぀いお話しおいるずきに、Marcos RACObserveがRACSignalを䜜成するこずを蚀及したした。これは、将来配信されるデヌタを衚したす。 このオブゞェクトは、ネットワヌク芁求を提瀺するのに理想的です。



シグナルは3皮類のむベントを送信したす。





シグナルの耐甚幎数は、任意の数の次のむベントで構成され、1぀の゚ラヌたたは完了 ただし、䞡方ではありたせん。



これは、ブロックを䜿甚しおネットワヌク芁求を䜜成した方法ず非垞に䌌おいたす。 しかし、違いは䜕ですか 埓来のブロックを信号で眮き換える理由 いく぀かの理由がありたす。



1コヌルバックを取り陀きたす



この悪倢のコヌドは、耇数のサブク゚リがあり、埌続のサブク゚リがそれぞれ前のサブク゚リの結果を䜿甚する堎合に発生したす。



2゚ラヌを1か所で凊理したす。



以䞋に小さな䟋を瀺したす。



loginUserずfetchUserInfoの 2぀のシグナルがあるずしたす。 ナヌザヌに「ログむン」しおからデヌタを受信するシグナルを䜜成したしょう。



 RACSignal *signal = [[networkClient loginUser] flattenMap:^RACStream *(User *user) { return [networkClient fetchUserInfo:user]; }];
      
      





loginUser信号が次のむベントを送信するず、 flattenMapブロックが呌び出され、この倀はナヌザヌパラメヌタヌを介しおブロックに枡されたす。 flattenMapブロックでは、前の信号からこの倀を取埗し、結果ずしお新しい信号を生成したす。 それでは、このシグナルをサブスクラむブしたしょう。



 [signal subscribeError:^(NSError *error) { // error from one of the signals } completed:^{ // side effects goes here. block get called when both signals completed }];
      
      





少なくずも1぀の信号が機胜しない堎合、 subscribeErrorブロックが発生するこずに泚意しおください。 最初のシグナルが倱敗するず、2番目のシグナルは実行されたせん。



3信号には、組み蟌みの廃棄キャンセルメカニズムがありたす。



たずえば、ナヌザヌはロヌド䞭に画面を離れるこずがよくありたす。 この堎合、ダりンロヌド操䜜をキャンセルする必芁がありたす。 このロゞックを信号に盎接実装でき、このロヌド操䜜ぞのリンクを保存するこずはできたせん。 たずえば、次のようにナヌザヌデヌタを読み蟌む信号を䜜成できたす。



 [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { __block NSURLSessionDataTask *task = [self GET:url parameters:parameters completion:^(id response, NSError *error) { if (!error) { [subscriber sendNext:response]; [subscriber sendCompleted]; } else { [subscriber sendError:error]; } }]; return [RACDisposable disposableWithBlock:^{ [task cancel]; }]; }]];
      
      





私は意図的にこのコヌドを単玔化しおアむデアを瀺したしたが、実際には、ブロックで自己をキャプチャするべきではありたせん。



シグナルを参照するこずにより、い぀キャンセルする必芁があるかを刀断できたす。



 [[networkClient loadChats] takeUntil:self.rac_willDeallocSignal];
      
      





たたは



 [[networkClient loadChats] takeUntil:[self.cancelButton rac_signalForControlEvents:UIControlEventTouchUpInside]];
      
      





このアプロヌチの玠晎らしい点は、操䜜を完了する必芁がある堎合にのみ䜿甚する操䜜ぞのリンクを保存しないこずです。 したがっお、䞭間状態を維持する必芁がないため、コヌドはより宣蚀的に芋えたす。



もちろん、シグナルを手動でキャンセルするこずもできたす-RACDisposableオブゞェクト subsribeNext / Error / Completedメ゜ッドから返されるぞの参照を保存し、必芁なずきに-disposeメ゜ッドを盎接呌び出したす。



シグナルを䜿甚しおネットワヌククラむアントを実装するこずは、かなり広範な議論のトピックです。 OctoKit -Reactive Cocoaを䜿甚しおネットワヌクの問題を解決する方法の奜䟋です。 Ash Furrowは、iOS向けのFunctional Reactive Programmingの本でもこのトピックを取り䞊げたした。



4.動䜜䞭のシグナル



いく぀かの問題を解決する際に、アプリケヌションのさたざたな郚分からのデヌタずむベントの郚分を組み合わせたした。 デヌタが衚瀺され、非同期に倉曎されたす。 これらに぀いお考える堎合、これは必須です。コヌドに远加する接続ず倉数を予枬し、さらに重芁なこずずしお、これらすべおを時間内に同期する方法を予枬しようずしたす。



おおよその䞀連のアクションを完成させるず、コヌドの蚘述を開始し、クラスのさたざたな郚分、たたはいく぀かのクラスでさえ、ゞプシヌキャラバンのようにプロゞェクトを「さたよっおいる」無甚な状態のコヌドの新しい行で汚染されたす。



このようなコヌドを解析するのがどれほど難しいか知っおいたす そしお時々、䜕が起こっおいるかを知る唯䞀の方法は、それを段階的にデバッグするこずです。



Reactive Cocoaを䜿甚しおしばらくしおから、䞊蚘のすべおの問題リンク、収集操䜜、ネットワヌクの操䜜を解決するための基瀎は、デヌタストリヌムRACStreamずしおのアプリケヌションラむフサむクルにあるこずを理解したした。 次に、ナヌザヌたたはネットワヌクからのデヌタを特定の方法で倉換する必芁がありたす。 タスクをはるかに簡単に解決できるこずがわかりたした



2぀の䟋を芋おみたしょう。



タスク1

これは、最近完了した実際のプロゞェクトの䟋です。



メッセヌゞを亀換する機䌚があり、タスクの1぀は、アプリケヌションアむコンに正しい数の未読メッセヌゞを衚瀺するこずでした。 通垞のタスクではありたせんか



未読のブヌル倀プロパティを栌玍するChatViewModelクラスがありたした。



 @interface ChatViewModel : NSObject @property(nonatomic, readonly) BOOL unread // other public declarations @end
      
      





そしお、コヌドのどこかに、これらのビュヌモデルを含むdataSourcの配列がありたした。



䜕をしたいですか 未読プロパティが倉曎されるたびに、未読メッセヌゞの数を曎新したす。 芁玠の数は、すべおのモデルのYES倀の数ず等しくする必芁がありたす。 信号を䜿甚しおこのパタヌンを実行しおみたしょう。



 RACSignal *unreadStatusChanged = [[RACObserve(self, dataSource) map:^id(NSArray *models) { RACSequence *sequence = [[models rac_sequence] map:^id(ChatViewModel *model) { return RACObserve(model, unread); }]; return [[RACSignal combineLatest:sequence] map:^id(RACTuple *unreadStatuses) { return [unreadStatuses.rac_sequence foldLeftWithStart:@0 reduce:^id(NSNumber *accumulator, NSNumber *unreadStatus) { return @(accumulator.integerValue + unreadStatus.integerValue); }]; }]; }] switchToLatest];
      
      





初心者には少し耇雑に芋えるかもしれたせんが、理解するのはずおも簡単です。



たず、配列の倉化を芳察したす。



 RACObserve(self, dataSource)
      
      





新しいチャットを䜜成し、叀いチャットを削陀できるず想定されおいるため、これは重芁です。 RACには可倉コレクション甚のKVOがないため、DataSourceは、オブゞェクトがdataSourceに远加/削陀されるたびに䞍倉の配列になりたす。 RACObservは、新しい倀がdataSourceに远加されるたびに新しい配列を返すシグナルを返したす。



さお、私たちは信号を埗たした...しかし、これは私たちが望んでいた信号ではないので、それを倉換する必芁がありたす。 -map挔算子は、このタスクに最適です。



 [RACObserve(self, dataSource) map:^id(NSArray *models) { }]
      
      





マップブロックには倚くのモデルがありたす。 すべおのモデルの未読プロパティの各倉曎に぀いお知りたいので、信号、たたは信号の配列さえ必芁です-各モデルに1぀の信号



  RACSequence *sequence = [[models rac_sequence] map:^id(ChatViewModel *model) { return RACObserve(model, unread); }];
      
      





ここには新しいものは䜕もありたせん。 RACSequence、map、RACObserve 。



泚 この堎合、倀のシヌケンスを信号のシヌケンスに倉換したす。



実際、それほど倚くの信号は必芁ありたせん。1぀必芁ですが、重芁なのは、絶えず倉化するデヌタを䞀緒に凊理する必芁があるためです。 RACで信号を結合するにはいく぀かの方法があり、ニヌズに合った方法を遞択できたす。



+ mergeは 、シグナルから単䞀のストリヌムに倀を転送したす。 これはニヌズを完党には満たしおいたせん。次のブロックでは、最埌の倀この堎合はYESたたはNO のみが衚瀺されたす。



合蚈を取埗するためにすべおの倀を知りたいので、 + composeLatestを䜿甚したす。信号の倉化を監芖し、倉化が発生したずきにすべおの信号の最埌の倀を送信したす。 次のブロックでは、すべおの未読倀の「スナップショット」を芋るこずができたす。



 [RACSignal combineLatest:sequence];
      
      





これで、単䞀の倀が倉曎されるたびに最新の倀の配列を取埗できたす。 ほが完了 残っおいる唯䞀のタスクは、この配列でYES倀が怜出される回数を蚈算するこずです。 簡単なルヌプでこれを行うこずができたすが、最埌たで機胜し、reduceステヌトメントを䜿甚したしょう。 reduceは、事前定矩されたルヌルによっおデヌタコレクションを単䞀の原子量に倉換する関数型プログラミングの有名な関数です。 RACでは、この関数は-foldLeftWithStartreduceたたは-foldLeftWithStartreduceです。



 [unreadStatuses.rac_sequence foldLeftWithStart:@0 reduce:^id(NSNumber *accumulator, NSNumber *unreadStatus) { return @(accumulator.integerValue + unreadStatus.integerValue); }];
      
      





最埌に䞍明な点は、なぜswitchToLatestが必芁なのかずいうこずです。



それなしでは、シグナルのシグナルを受け取りたす配列の倀をシグナルに倉換するため。unreadStatusChangedにサブスクラむブするず、倀ではなく次のブロックでシグナルを受け取りたす。 これを修正するには、 -flattenたたは-switchToLatest  平坊化されおいたすが、わずかに違いがありたすを䜿甚できたす。



flattenは、珟圚フラット化されおいるサブスクラむバヌが、倉換から返される信号を䜿甚しお送信された倀を受信するこずを意味したす。 -flattenはシグナルからシグナルを受信し、それらに送信される次の倀を結合したすが、 -switchToLatestは同じこずを行いたすが、倀は最埌のシグナルからのみリダむレクトしたす。



私たちの堎合、 dataSourceの叀いバヌゞョンぞの倉曎を受け取りたくないので、これはうたく機胜したす。 信号は準備ができおおり、䜿甚できたす。副䜜甚を実行したしょう。



 RAC([UIApplication sharedApplication], applicationIconBadgeNumber) = unreadStatusChanged;
      
      





問題のステヌトメントがどのようにコヌドに関連しおいるかに気づきたしたか 1぀の堎所で宣蚀的に䜕をしたいのかを曞きたした。 䞭間状態を維持する必芁はありたせん。



カスタム信号を䜜成するための適切な挔算子を芋぀けるために、フレヌムワヌクのドキュメントを掘り䞋げる必芁がある堎合がありたすが、それだけの䟡倀はありたす。



タスク2



フレヌムワヌクの機胜を瀺す別のタスクを次に瀺したす。 チャットリスト画面がありたした。タスクは、チャットリスト画面を開いた状態で、最埌のチャットメッセヌゞを衚瀺するこずでした。 生成された信号は次のようになりたす。



 RACSignal *chatReceivedFirstMessage = [[RACObserve(self, dataSource) map:^id(NSArray *chats) { RACSequence *sequence = [[[chats rac_sequence] filter:^BOOL(ChatViewModel *chat) { return ![chat hasMessages]; }] map:^id(ChatViewModel *chat) { return [[RACObserve(chat, lastMessage) ignore:nil] take:1]; }] ; return [RACSignal merge:sequence]; }] switchToLatest];
      
      





それが䜕で構成されるかを芋おみたしょう。



この䟋は、前の䟋ず非垞によく䌌おいたす。 配列を芳察し、マップ挔算子が倀を信号に倉換し、最新の信号のみを考慮したす。



たず、メッセヌゞのあるチャットには関心がないため、倉換ブロックでdataSourceをフィルタヌ凊理したす。



次に、再びRACObserveを䜿甚しお、倀をシグナルに倉換したす。



 return [[RACObserve(chat, lastMessage) ignore:nil] take:1];
      
      





RACObserveによっお生成されたシグナルはプロパティの初期倀nilで起動するため、 -ignore を無芖する必芁がありたす。 挔算子が必芁です。



タスクの2番目の郚分は、最初の着信メッセヌゞ-Takeのみを考慮するこずです。 それの䞖話をしたす。 シグナルは、最初の倀を受信するずすぐに完了および削陀されたす。



明確にするためだけです。 このコヌドで䜜成した3぀の新しい信号がありたす。 最初はRACObserveマクロによっお䜜成され、2番目は最初に新しく䜜成されたシグナルのステヌトメントの-ignoreを呌び出しお、3番目は-takeを呌び出しお-ignoreによっお䜜成されたシグナルによっお



前の䟋のように、生成された信号に基づいお1぀の信号が必芁です。 前の䟋のように倀を気にしないため、 -mergeを䜿甚しお新しいマヌゞされたストリヌムを䜜成したす。



副䜜甚時間



 [chatReceivedFirstMessage subscribeNext:^(id x) { // switching to chat screen }];
      
      





泚 信号に含たれる倀は䜿甚したせん。 ただし、 xには受信したメッセヌゞが含たれたす。



それでは、Reactive Cocoaの印象に぀いお少し話したしょう。



Reactive Cocoaに぀いお私が本圓に奜きなこず



1.プロゞェクトでの䜿甚は簡単です。 フレヌムワヌクは狂ったように文曞化されおいたす。 GitHubには倚くの䟋があり、各クラスずメ゜ッドの詳现な説明、倚数の蚘事、ビデオ、プレれンテヌションがありたす。



2.プログラミングスタむルを完党に倉曎する必芁はありたせん。 たず、UIバむンディング、ネットワヌクラッパヌ、GitHubを䜿甚したその他の゜リュヌションなど、問題に察する既存の゜リュヌションを䜿甚できたす。 その埌、段階的に、Reactive Cocoaのすべおの機胜を理解できたす。



3.問題の解決方法が呜什型から宣蚀型に倉わりたす。 プログラミングの機胜的なスタむルがiOSコミュニティでたすたす䞀般的になっおきおいるため、倚くの人が基本的に考え方を倉えるこずは困難です。 Reactive Cocoaには、「 方法 」スタむルではなく「䜕をする」スタむルで通信するのに圹立぀倚くのツヌルがあるため、倉曎を加えるのに圹立ちたす。



Reactive Cocoaが気に入らない点



1. RACたたはRACObserveマクロの普及。



2. RACSignalsを䜿甚するず深いスタックトレヌスが発生するため、コヌドのデバッグが困難な堎合がありたす。



3. タむプセヌフではありたせん subscribeNextブロックでどのタむプが期埅されるかわかりたせん。 この堎合の最良の解決策は、䟋ずしお、パブリックむンタヌフェむスで信号を文曞化するこずです。



 /** * Returns a signal which will send a User and complete or error. */ -(RACSignal *)loginUser;
      
      





私も助けるこずはできたせんが、スりィフトに蚀及したす



Reactive CocoaはObjective-Cで、特にObjective-C向けに䜜成されおいたす。 しかし、もちろん、Swiftの人気が高たっおいる今、フレヌムワヌク開発者は怠けおいるわけではありたせん。 圌らは、Reactive CocoaGreat Swiftening closeで䜿甚するために、実際にSwift APIを䜜成したす。 控えめに蚀えば、ブラックゞャックず売春婊、ゞェネリック、およびオペレヌタヌのオヌバヌロヌドを備えた新しいバヌゞョン3.0がありたす。



この埌、RACはさらに倚くのファンを獲埗するず確信しおいたす。 たもなく、マクロず非型安党性を呪う完璧䞻矩者は、Reactive Cocoaを䜿甚せずに自分自身を保護するずいう議論を持ちたせん。



おわりに



機胜的で応答性の高いアプロヌチにより、日垞のタスクを簡玠化できたす。 おそらく、第䞀に、RACの抂念は耇雑すぎるように思われ、その決定は面倒で巚倧であり、オペレヌタヌの数はあなたを倧きく混乱させたす。 しかし、埌で、これらすべおが単玔なアむデアを持っおいるこずが明らかになりたす。



デヌタ入力たたは出力をストリヌムずしお提瀺したす。むベントデヌタ、゚ラヌ、完了のパむプのようなストリヌム。シグナルずシヌケンスはストリヌムです。シグナルは制埡されたストリヌムです。䜕かがあるず、ナヌザヌに入力を䞎えたり、ディスクからの非同期ロヌドなどを行いたす。シヌケンスは、栌玍匏ドラむブを備えたスレッドです。䜕かが必芁な堎合は、シヌケンスコレクションなどから描画したす。他のすべおの倉換挔算子および結合挔算子は、これらすべおを䞀緒に倉換したす倉換、フィルタヌ、結合、switchToLatest、チョヌクなど。



さらに、すべおのむベントは、䜜成されたストリヌム内のサブスクラむバヌに配信されるこずを芚えおおく必芁がありたす。それを指定する必芁がある堎合は、-deliverOn挔算子を䜿甚しおこのRACSchedulerGCDキュヌに䌌おいたすが、キャンセルする機胜を持぀クラスを適甚したす



䞀般的なルヌルずしお、あなたは明瀺的むンタヌフェむスを曎新するだけで、[RACScheduler mainThreadScheduler]を指定する必芁がありたすが、独自の実装を曞くこずができRACSceduler、のようなものを特定しお、あなたしおいる取匕、CoreDataを。



All Articles