初認(rèn)RAC

ReactiveCocoa的核心:

信號闽巩,沒錯就是信號糯俗,發(fā)了信號要干嘛干嘛饶唤,講白了就是一個事件流;

那么我們來把這件事做一個形象的比喻:

可以把信號想象成水龍頭光绕,只不過里面不是水女嘲,
而是玻璃球(value),直徑跟水管的內(nèi)徑一樣诞帐,
這樣就能保證玻璃球是依次排列欣尼,不會出現(xiàn)并排的情況
(數(shù)據(jù)都是線性處理的,不會出現(xiàn)并發(fā)情況)停蕉。
水龍頭的開關(guān)默認(rèn)是關(guān)的愕鼓,除非有了接收方(subscriber),才會打開谷徙。
這樣只要有新的玻璃球進(jìn)來拒啰,就會自動傳送給接收方。
可以在水龍頭上加一個過濾嘴(filter)完慧,不符合的不讓通過谋旦,
也可以加一個改動裝置,把球改變成符合自己的需求(map)屈尼。
也可以把多個水龍頭合并成一個新的水龍頭(combineLatest:reduce:)册着,
這樣只要其中的一個水龍頭有玻璃球出來,
這個新合并的水龍頭就會得到這個球脾歧。

需要說明的是因?yàn)镽AC使用大量的block甲捏,請避免循環(huán)引用

例如:

[RACObserve(self,username) subscribeNext:^(NSString *newName){
    NSLog(@"Name changed to %@",newName);
}];
RACObserve使用kvo來監(jiān)聽username的變化,只要有變化就會執(zhí)行block鞭执。
但不是所有的property都可以被RACObserve司顿,該property必須支持KVO芒粹,比如NSURLCache的currentDiskUsage就不能被RACObserve。

Signal和Subscriber

Signal獲取到數(shù)據(jù)后大溜,會調(diào)用Subscriber的sendNext,
 sendComplete, sendError方法來傳送數(shù)據(jù)給Subscriber,Subscriber自然也有方法來獲取傳過來的數(shù)據(jù)化漆,如:
[signal subscribeNext:error:completed]。這樣只要沒有sendComplete和sendError钦奋,
新的值就會通過sendNext源源不斷地傳送過來.
ReactiveCocoa signal(RACSignal)
發(fā)送事件流給它的subscriber座云。

目前共有三種類型的事件:

 next、__error__付材、completed朦拖。

一個signal在因error終止或者完成前,可以發(fā)送任意數(shù)量的next事件.
RACSignal有很多方法可以來訂閱不同的事件類型厌衔。
每個方法都需要至少一個block璧帝,當(dāng)事件發(fā)生時就會執(zhí)行block中的邏輯。
ReactiveCocoa 框架使用 category 來為很多基本UIKit控件添加signal葵诈。
這樣就能給控件添加訂閱了裸弦,比如 text field 的 rac_textSignalRACSignal的每個操作都會返回一個RACsignal祟同,
這在術(shù)語上叫做連貫接口(fluent interface)作喘。這個功
能可以讓你直接構(gòu)建管道,而不用每一步都使用本地變量晕城。


片段解析:

  • 只要 text 有變化泞坦, 將 text 發(fā)送給 Subscriber

    [self.usernameTextField.rac_textSignal subscribeNext:^(id x){
     NSLog(@"%@", x);
    

    }];

篩選長度 >3, 滿足則發(fā)送給 Subscriber
  [[self.usernameTextField.rac_textSignal
  filter:^BOOL(NSString *text){
    return text.length > 3;
  }]
     subscribeNext:^(id x){
     NSLog(@"%@", x);
     }];

上面代碼如果按步驟來:

     RACSignal *usernameSourceSignal =
     self.usernameTextField.rac_textSignal;

     RACSignal *filteredUsername = [usernameSourceSignal
     filter:^BOOL(id value){
         NSString*text = value;
         return text.length > 3;
   }];

     [filteredUsername subscribeNext:^(id x){
       NSLog(@"%@", x);
     }];
  • 在管道中添加map:
    這里的 map 操作之后的步驟收到的都是NSNumber實(shí)例。
    可以使用map操作來把接收的數(shù)據(jù)轉(zhuǎn)換成想要的類型砖顷,只要它是
    對象
    贰锁。**

     [[[self.usernameTextField.rac_textSignal
      map:^id(NSString*text){
          return @(text.length);
      }]
     filter:^BOOL(NSNumber*length){
         return[length integerValue] > 3;
     }]
    subscribeNext:^(id x){
        NSLog(@"%@", x);
    }];
    

新加的map操作通過block改變了事件的數(shù)據(jù)。map從上一個next事件接收數(shù)據(jù)滤蝠,通過執(zhí)行block把返回值傳給下一個next事件豌熄。在上面的代碼中,map以NSString為輸入物咳,取字符串的長度锣险,返回一個NSNumber。

結(jié)尾:

簡明語法入門览闰,圖文并茂:
http://www.teehanlax.com/blog/reactivecocoa/
參考:
http://benbeng.leanote.com/post/ReactiveCocoaTutorial-part1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芯肤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子压鉴,更是在濱河造成了極大的恐慌崖咨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油吭,死亡現(xiàn)場離奇詭異击蹲,居然都是意外死亡署拟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門歌豺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芯丧,“玉大人,你說我怎么就攤上這事世曾∮Ш悖” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵轮听,是天一觀的道長骗露。 經(jīng)常有香客問我,道長血巍,這世上最難降的妖魔是什么萧锉? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮述寡,結(jié)果婚禮上柿隙,老公的妹妹穿的比我還像新娘。我一直安慰自己鲫凶,他們只是感情好禀崖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螟炫,像睡著了一般波附。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昼钻,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天掸屡,我揣著相機(jī)與錄音,去河邊找鬼然评。 笑死仅财,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碗淌。 我是一名探鬼主播盏求,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贯莺!你這毒婦竟也來了风喇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缕探,失蹤者是張志新(化名)和其女友劉穎魂莫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹耗,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耙考,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年谜喊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倦始。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗遏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞋邑,到底是詐尸還是另有隱情诵次,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布枚碗,位于F島的核電站逾一,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肮雨。R本人自食惡果不足惜遵堵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怨规。 院中可真熱鬧陌宿,春花似錦、人聲如沸波丰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀舔。三九已至弥虐,卻和暖如春扩灯,著一層夾襖步出監(jiān)牢的瞬間媚赖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工珠插, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惧磺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓捻撑,卻偏偏與公主長得像磨隘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子顾患,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

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