RAC的坑


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代碼中不要阻塞。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM