http://www.cocoachina.com/industry/20140609/8737.html
1.對數組的觀察
有了這些Category,大部分的Delegate都可以使用RAC來做。或許你會想,可不可以subscribe NSMutableArray.rac_sequence.signal,這樣每次有新的object或舊的object被移除時都能知道,UITableViewController就可以根據dataSource的變化,來reloadData。但很可惜這樣不行,因為RAC是基於KVO的,而NSMutableArray並不會在調用addObject或removeObject時發送通知,所以不可行。不過可以使用NSArray作為UITableView的dataSource,只要dataSource有變動就換成新的Array,這樣就可以了。
2.Cell復用時的清理
說到UITableView,再說一下UITableViewCell,RAC給UITableViewCell提供了一個方法:rac_prepareForReuseSignal
,它的作用是當Cell即將要被重用時,告訴Cell。想象Cell上有多個button,Cell在初始化時給每個button都addTarget:action:forControlEvents
,被重用時需要先移除這些target,下面這段代碼就可以很方便地解決這個問題:
[[[self.cancelButton rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_prepareForReuseSignal] subscribeNext:^(UIButton *x) { // do other things }];
3.RACCommand自動綁定
button.rac_command = [[RACCommand alloc]initWithEnable:xxx signalBlock:xxx];
button的enabled自動與command的enabled綁定,無需另外聲明。
4.combineLatest觸發時機
combineLatest后面跟的信號集合中,每個信號都有值之后就會第一次觸發,之后,任意一個信號有了新值就會觸發。
rac_liftSelector:withSignals
也是類似,它的意思是當signalA和signalB都至少sendNext過一次,接下來只要其中任意一個signal有了新的內容,相應方法就會自動被觸發。
5.RACObserve自動sendNext
使用RACObserve觀察屬性時,會立即將屬性當前值sendNext.
6.rac_willDeallocSignal不會sendNext,只會sendComplete
7.實踐建議
當一個signal被一個subscriber subscribe后,這個subscriber何時會被移除?答案是當subscriber被sendComplete或sendError時,或者手動調用[disposable dispose]。
當subscriber被dispose后,所有該subscriber相關的工作都會被停止或取消,如http請求,資源也會被釋放。
Signal events是線性的,不會出現並發的情況,除非顯示地指定Scheduler。所以-subscribeNext:error:completed:
里的block不需要鎖定或者synchronized等操作,其他的events會依次排隊,直到block處理完成。
Errors有優先權,如果有多個signals被同時監聽,只要其中一個signal sendError,那么error就會立刻被傳送給subscriber,並導致signals終止執行。相當於Exception。
生成Signal時,最好指定Name, -setNameWithFormat:
方便調試。
block代碼中不要阻塞。