神奇的RAC宏,神奇RAC宏
先說說RAC中必須要知道的宏
- RAC(TARGET, [KEYPATH, [NIL_VALUE]])
使用:
RAC(self.outputLabel, text) = self.inputTextField.rac_textSignal; RAC(self.outputLabel, text, @"收到nil時就顯示我") = self.inputTextField.rac_textSignal;
這個宏是最常用的,RAC()總是出現在等號左邊,等號右邊是一個RACSignal,表示的意義是將一個對象的一個屬性和一個signal綁定,signal每產生一個value(id類型),都會自動執行:
- [TARGET setValue:value ?: NIL_VALUE forKeyPath:KEYPATH];
數字值會升級為NSNumber *,當setValue:forKeyPath時會自動降級成基本類型(int, float ,BOOL等),所以RAC綁定一個基本類型的值是沒有問題的
- RACObserve(TARGET, KEYPATH)
作用是觀察TARGET的KEYPATH屬性,相當於KVO,產生一個RACSignal 最常用的使用,和RAC宏綁定屬性:
RAC(self.outputLabel, text) = RACObserve(self.model, name);
上面的代碼將label的輸出和model的name屬性綁定,實現聯動,name但凡有變化都會使得label輸出
@weakify(Obj); @strongify(Obj);
這對宏在 RACEXTScope.h 中定義,RACFramework好像沒有預設引入,需要單獨import
他們的作用主要是在block內部管理對self的引用:
@weakify(self); // 定義了一個__weak的self_weak_變數 [RACObserve(self, name) subscribeNext:^(NSString *name) { @strongify(self); // 局域定義了一個__strong的self指標指向self_weak self.outputLabel.text = name; }];
這個宏為什麼這麼吊,前面加@,其實就是一個啥都沒乾的@autoreleasepool {}前面的那個@,為了顯眼罷了。 這兩個宏一定成對出現,先weak再strong