本人有若干成套學習視頻, 可試看! 可試看! 可試看, 重要的事情說三遍 包含Java
, 數(shù)據(jù)結構與算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 聯(lián)系微信tsaievan
.
RAC中有一些特別牛逼的宏, 牛逼到什么程度呢? 牛逼到看都看不懂. 所以別人作者的潛臺詞就是告訴你: 會用就行了.
下面就來總結一下RAC中常見的, 吊到炸毛的宏:
RAC(TARGET, ...)
分配一個信號給一個對象的屬性, 只要有新的信號產(chǎn)生, 就自動分配給特定的key
, 當信號完成時, 綁定自動廢棄.
RAC(_targetLabel,text) = _textField.rac_textSignal;
一行代碼, 搞定, 完成效果如下:
RAC宏實現(xiàn)效果
-
RACObserve(TARGET, KEYPATH)
替代KVO的宏:
當TARGET
的KEYPATH
發(fā)生變化時, 就會產(chǎn)生新的信號.
[RACObserve(_targetLabel, text) subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
RACTuplePack(...)
利用指定的值包裝成新的元祖. 至少指定一個值,值可以是nil
RACTuple *tuple = RACTuplePack(@"abc", @"efg");
NSLog(@"%@", tuple[0]);
運行結果如下:
打印結果
RACTupleUnpack(...)
聲明新的對象變量, 并將元祖解包后賦值給這些變量
這個宏需要放在=
的左邊, 元祖放在=
右邊, 且這一行代碼不能還出現(xiàn)別的東西. 這個宏不能是條件判斷語句或者循環(huán)體內唯一的語句,
- 如果元祖包含的值多于聲明的變量, 那么元祖包含的多余的值將被忽略
- 如果元祖包含的值少于聲明的變量, 那么多出來的變量將會被賦值為
nil
RACTuple *tuple = RACTuplePack(@"abc", @"efg");
RACTupleUnpack(NSString *string1,NSString *string2) = tuple;
NSLog(@"%@---%@",string1,string2);
運行結果如下:
解包的宏打印的結果
-
@weakify(...)
&@strongify(...)
解除循環(huán)引用必備神器
@weakify(...)
給其中的參數(shù)變量創(chuàng)建一個C語言的__weak修飾的影子變量, 這些影子變量隨后又會被@strongify(...)
修飾, 重新成為強引用的變量
在block中, 這個宏用弱引用變量, 但在block執(zhí)行的時候, 要確保該變量一直存在
@strongify(...)
將參數(shù)變量強引用, 但前提是, 這些參數(shù)之前要被@weakify(...)
修飾過, 這個宏將覆蓋掉初始的變量名, 所以在當前作用域使用原來的變量名并不會引起循環(huán)引用:
id foo = [[NSObject alloc] init];
id bar = [[NSObject alloc] init];
@weakify(foo, bar);
// this block will not keep 'foo' or 'bar' alive
BOOL (^matchesFooOrBar)(id) = ^ BOOL (id obj){
// but now, upon entry, 'foo' and 'bar' will stay alive until the block has
// finished executing
@strongify(foo, bar);
return [foo isEqual:obj] || [bar isEqual:obj];
};