ReactiveCocoa 使用.RACSubject類使用

我們知道只要創(chuàng)建一個信號,在有一個訂閱者去訂閱她我們就可以發(fā)送消息了。但是有沒有一個對象既可以發(fā)送消息又可以訂閱消息呢喜庞? 這時候RACSubject 就出現(xiàn)了案狠,因為它繼承與RACSignal信號類又遵守RACSubscribe協(xié)議這樣達(dá)到了就既能發(fā)送,又能訂閱信號的操作了卷雕。他的使用場景可以做為代理來使用 或者 用來綁定ViewModel和View

RACSubject
- (void)subjectTest {
    
    RACSubject *subject = [RACSubject subject];
    // 2.訂閱信號(這里可以創(chuàng)建多個訂閱者)
    [subject subscribeNext:^(id x) {
        // block調(diào)用時刻:當(dāng)信號發(fā)出新值节猿,就會調(diào)用.
        NSLog(@"第一個訂閱者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        // block調(diào)用時刻:當(dāng)信號發(fā)出新值,就會調(diào)用.
        NSLog(@"第二個訂閱者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        // block調(diào)用時刻:當(dāng)信號發(fā)出新值,就會調(diào)用.
        NSLog(@"第三個訂閱者%@",x);
    }];
    // 3.發(fā)送信號
    [subject sendNext:@"1"];
}
RACReplaySubject
  • 可以先訂閱信號滨嘱,也可以先發(fā)送信號
  • 調(diào)用sendNext發(fā)送信號峰鄙,把值保存起來,然后遍歷剛剛保存的所有訂閱者太雨,一個一個調(diào)用訂閱者的nextBlock吟榴。
  • 調(diào)用subscribeNext訂閱信號,遍歷保存的所有值囊扳,一個一個調(diào)用訂閱者的nextBlock
    如果想當(dāng)一個信號被訂閱吩翻,就重復(fù)播放之前所有值,需要先發(fā)送信號宪拥,在訂閱信號仿野。
- (void)replaySubjectTest{
RACReplaySubject *replaySubject = [RACReplaySubject subject];
    
    // 2.發(fā)送信號
    [replaySubject sendNext:@1];
    [replaySubject sendNext:@2];
    
    // 3.訂閱信號
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第一個訂閱者接收到的數(shù)據(jù)%@",x);
    }];
    
    // 訂閱信號
    [replaySubject subscribeNext:^(id x) {
        
        NSLog(@"第二個訂閱者接收到的數(shù)據(jù)%@",x);
    }];
}

上一篇講解了下RACSignal內(nèi)部的流程,知道了RACSignal在看RACSubject就簡單很多了她君,畢竟是RACSubject繼承與RACSignal脚作,一些方法都是大同小異的。

1 創(chuàng)建信號
+ (instancetype)subject {
    return [[self alloc] init];
}

- (id)init {
    self = [super init];
    if (self == nil) return nil;

    _disposable = [RACCompoundDisposable compoundDisposable];
    _subscribers = [[NSMutableArray alloc] initWithCapacity:1];
    
    return self;
}

  • 創(chuàng)建RACSubject對象的時候同時創(chuàng)建了相應(yīng)的一個disposable和一個訂閱者數(shù)組,僅僅而已
2 訂閱信號
- (RACDisposable *)subscribe:(id<RACSubscriber>)subscriber {
    NSCParameterAssert(subscriber != nil);

    RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];
    subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];

    NSMutableArray *subscribers = self.subscribers;
    @synchronized (subscribers) {
        [subscribers addObject:subscriber];
    }
    
    return [RACDisposable disposableWithBlock:^{
        @synchronized (subscribers) {
            // Since newer subscribers are generally shorter-lived, search
            // starting from the end of the list.
            NSUInteger index = [subscribers indexOfObjectWithOptions:NSEnumerationReverse passingTest:^ BOOL (id<RACSubscriber> obj, NSUInteger index, BOOL *stop) {
                return obj == subscriber;
            }];

            if (index != NSNotFound) [subscribers removeObjectAtIndex:index];
        }
    }];
}
  • RACSubejct是可以多次訂閱的 它把生產(chǎn)的訂閱者存入訂閱者數(shù)組中缔刹,每個訂閱者都包含自己的對應(yīng)的block(next,error,complete)
  • 它比RACSignal取消的時候多做了一些清理工作球涛,把訂閱者數(shù)組中的相對于的訂閱者去除并取消
3 發(fā)送信號
- (void)sendNext:(id)value {
    [self enumerateSubscribersUsingBlock:^(id<RACSubscriber> subscriber) {
        [subscriber sendNext:value];
    }];
}
  • 先遍歷訂閱者數(shù)組中的訂閱者
  • 后執(zhí)行訂閱者中的nextBlock
  • 訂閱者發(fā)送信號

借用他們的流程圖為

1467716-f2b4f5f91210d0ba.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市校镐,隨后出現(xiàn)的幾起案子亿扁,更是在濱河造成了極大的恐慌,老刑警劉巖鸟廓,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件从祝,死亡現(xiàn)場離奇詭異,居然都是意外死亡引谜,警方通過查閱死者的電腦和手機(jī)牍陌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员咽,“玉大人毒涧,你說我怎么就攤上這事”词遥” “怎么了契讲?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滑频。 經(jīng)常有香客問我捡偏,道長,這世上最難降的妖魔是什么峡迷? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任霹琼,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枣申。我一直安慰自己,他們只是感情好看杭,可當(dāng)我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布忠藤。 她就那樣靜靜地躺著,像睡著了一般楼雹。 火紅的嫁衣襯著肌膚如雪模孩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天贮缅,我揣著相機(jī)與錄音榨咐,去河邊找鬼。 笑死谴供,一個胖子當(dāng)著我的面吹牛块茁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桂肌,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了健爬?” 一聲冷哼從身側(cè)響起砂竖,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谭跨,沒想到半個月后干厚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡螃宙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年蛮瞄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片污呼。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡裕坊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出燕酷,到底是詐尸還是另有隱情籍凝,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布苗缩,位于F島的核電站饵蒂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酱讶。R本人自食惡果不足惜退盯,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渊迁,春花似錦慰照、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箱叁,卻和暖如春墅垮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耕漱。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工算色, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人螟够。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓灾梦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親齐鲤。 傳聞我的和親對象是個殘疾皇子斥废,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容