context
我們傳統(tǒng)的使用 UIButton
的方式,都是 Target-Action
的方式. 但是有幾個(gè)問(wèn)題:
-
局部變量共享
有個(gè)變量,我們需要在Action中使用,由于在
Target-Action
的機(jī)制中,Action
的參數(shù)撐死只能是sender
, 所以,導(dǎo)致共享的方式,只能靠通過(guò)定義Property來(lái)實(shí)現(xiàn) .這就需要程序員打斷現(xiàn)有的思路,去定義Property . 對(duì)于一份有良好代碼組織的代碼(對(duì)不同種類(lèi)的方法進(jìn)行了種類(lèi)劃分的)就需要反復(fù)跳轉(zhuǎn)去實(shí)現(xiàn)方法 . -
代碼閱讀
如第一條中所說(shuō), 編寫(xiě)代碼的時(shí)候,尚且需要跳來(lái)跳去, 對(duì)新同事去接手代碼,閱讀成本更加高.
解決方案 without ReactiveCocoa
局部變量共享
可以采用Runtime
的方法,給NSObject添加一個(gè)屬性,讓Button帶著內(nèi)容進(jìn)去Action給Button添加自依賴(lài),參考 我之前的博客
開(kāi)發(fā)者都聲稱(chēng) Runtime
是黑魔法 . 所以 …
ReactiveCocoa的解決
RACSignal 方式
[[self.button
rac_signalForControlEvents:UIControlEventTouchUpInside]
subscribeNext:^(id x) {
NSLog(@"button clicked");
}];
以上是利用UI事件創(chuàng)建信號(hào)
RACCommand方式
RACCommand* aCommand =
[[RACCommand alloc] initWithSignalBlock:^RACSignal*(id input) {
return [RACSignal
createSignal:^RACDisposable*(id<RACSubscriber> subscriber) {
NSLog(@"----");
[subscriber sendCompleted];
return nil;
}];
}];
self.testButton.rac_command = aCommand;
根據(jù)官方文檔來(lái)說(shuō), RACCommand 是對(duì)事件響應(yīng)更官方的做法 ,而且,還可以通過(guò) execute 手動(dòng)執(zhí)行.
[aCommand execute:nil]
RACSignal 的方式是簡(jiǎn)單易讀.
兩種方式可以根據(jù)實(shí)際需要選擇 .