Java設計形式編程中的工場辦法形式和籠統工場形式。本站提示廣大學習愛好者:(Java設計形式編程中的工場辦法形式和籠統工場形式)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式編程中的工場辦法形式和籠統工場形式正文
相干浏覽:
ReactiveCocoa代碼理論之-更多思慮
ReactiveCocoa代碼理論之-RAC收集要求重構這一節是本身對收集層的一些重構,本節是本身一些代碼小理論做出的一些demo法式,根本涵蓋年夜多半UI控件操作。
一.用UISlider完成調色板
假定我們如今做一個demo,下面有一個View用來展現色彩,上面有三個UISlider滑竿分離掌握RGB的色值,跟著分歧滑竿的拖動下面view的色彩會隨之轉變。 可以先腦補一下不消RAC該怎樣寫。 假如應用RAC只須要將三個旌旗燈號包裝起來用恰當的操作就可以完成。
// 拖線的UI控件 @property (weak, nonatomic) IBOutlet UIView *topView; @property (weak, nonatomic) IBOutlet UISlider *slider; @property (weak, nonatomic) IBOutlet UISlider *slider; @property (weak, nonatomic) IBOutlet UISlider *slider; // viewDidLoad中 // 分離將三個控件的轉變都包成一個旌旗燈號。 RACSignal *s = [[self.slider rac_newValueChannelWithNilValue:@]startWith:@]; RACSignal *s = [[self.slider rac_newValueChannelWithNilValue:@]startWith:@]; RACSignal *s = [[self.slider rac_newValueChannelWithNilValue:@]startWith:@]; RACSignal *threeSignal = [RACSignal combineLatest:@[s,s,s] reduce:^id(NSNumber* value,NSNumber* value,NSNumber* value){ return @[value,value,value]; }]; // 監聽這個"分解"後的旌旗燈號,轉變view的色彩 [threeSignal subscribeNext:^(NSArray *arr) { self.topView.backgroundColor = [UIColor colorWithRed:[arr[] doubleValue] green:[arr[] doubleValue] blue:[arr[] doubleValue] alpha:]; }];
下面的startWith:@0須要留意,假如不加這個初始值那必需在三個滑竿都動一下能力顯示色彩。 下面應用的辦法時UISlider專屬的,也能夠用上面的辦法寫,這個是UIControl的辦法會支撐更多其他UI控件。
RACSignal *s1 = [[[self.slider1 rac_signalForControlEvents:UIControlEventValueChanged] map:^id(id value) { return @(self.slider1.value); }] startWith:@0];
二.簡練代碼完成登錄邏輯
在UI控件中難點不多,然則值得留意的就是各類狀況的多級治理,假如哪裡忽視了就很輕易形成bug,這也就招致許多處所有斷定構造,而且各類往返賦值。 假定如今須要做一個登錄框,有賬號暗碼和贊成條目三項,必需知足賬號暗碼年夜於2位且選擇了贊成,才許可注冊。 舊的寫法異常費事,還須要監聽valueChange事宜等。假如用RAC只須要寫以下代碼:
@property (weak, nonatomic) IBOutlet UITextField *accountTxt; @property (weak, nonatomic) IBOutlet UITextField *pwdTxt; @property (weak, nonatomic) IBOutlet SXSwitch *agreeSw; // 贊成條目 @property (weak, nonatomic) IBOutlet UIButton *loginBtn; // 注冊按鈕 // viewDidLoad辦法 self.loginBtn.enabled = NO; RAC(self.loginBtn , enabled) = [RACSignal combineLatest:@[self.accountTxt.rac_textSignal , self.pwdTxt.rac_textSignal, self.agreeSw.rac_newOnChannel] reduce:^(NSString *account, NSString *pwd, NSNumber *isOn){ return @((account.length > )&&(pwd.length >)&&[isOn boolValue]); }];
這個中combineLatest數組頂用的都是控件專屬的旌旗燈號, 也能夠應用RAC(self.agreeSw, on) 這類寫法直接把某一個屬性的狀況用旌旗燈號傳過去。然則這裡須要留意:假定你監聽了A類的B屬性時,只要走了B屬性的set辦法才會被監聽捕捉,假如是經由過程其他辦法修正的屬性值則有效。 好比UISwitch的往返撥動進程中並沒有走on這個屬性的set辦法。
三.經由過程interval辦法完成時鐘
這是一種默許輪回的辦法,除非你經由過程掌握Disposable把他禁了。 interval這個辦法就是傳入一個參數是距離時光,然後外部每隔這一段時光就發一個[NSDate date]的對象,然後block外部把這個date設置一個格局以字符串的辦法前往。
RAC(self, timeLabel.text) = [[[RACSignal interval: onScheduler:[RACScheduler currentScheduler]] startWith:[NSDate date]] map:^id (NSDate *value) { NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:value]; return [NSString stringWithFormat:@"%ld:%ld:%ld", (long)dateComponents.hour, (long)dateComponents.minute, (long)dateComponents.second]; }];
四.其他控件事宜操作
除下面的UIButton,UISlider,UIControl的分類辦法還有許多操作
UISegmentedControl (RACSignalSupport)分類就為此控件供給了便捷處置辦法,比擬於慣例的監聽seg的元素點擊事宜,再掏出以後選中的index。RACSignal可以直接獲得須要的值
[[self.seg rac_newSelectedSegmentIndexChannelWithNilValue:@]subscribeNext:^(id x) { // 前往的根本數據類型都被裝包成NSNumber,可在此做一些斷定操作 NSLog(@"selectIndex-%@",x); }];
UIDatePicker (RACSignalSupport)分類為時光選擇框封裝了一個操作,每被選框轉變時前往NSDate類型
[[picker rac_newDateChannelWithNilValue:[NSDate date]]subscribeNext:^(NSDate *x) { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; dateFormatter.dateFormat = @"HH:mm"; dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; NSString *dateStr = [dateFormatter stringFromDate:x]; }];
假如在這裡給控件賦值,每次修改都邑讓展現控件的值更新,假如有的設計不願望這麼頻仍只要在點擊確認後再將時光顯示可以依據本身愛好自行賦值。
除此這些還有許多UI控件綁定的辦法 UIAlertView (RACSignalSupport) 外面就供給了一些辦法好比點擊彈窗按鈕可以在subscribeNext裡同一處置各個按鈕的點擊事宜。 然則如今UIAlertView已被UIAlertController代替所以,UIAlertView和UIActionSheet這裡可以疏忽不提。
五.性命周期相干操作
UITableView和UICollectionView的Cell都有重用的機制,假如給這個Cell綁定了一些監聽,那這個Cell被重用它子控件的監聽該何去何從?UITableViewCell (RACSignalSupport)、UICollectionReusableView (RACSignalSupport)這兩個分類裡供給了行將重用時的旌旗燈號rac_prepareForReuseSignal
做過兩個相似的場景,一個是tableView的cell答復按鈕點擊會跳到答復頁,一個是collection的item內有個按鈕點擊就變色彩。
// UITableViewDataSource - (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { SXFeedbackCell * cell = [tableView dequeueReusableCellWithIdentifier:@"SXFeedbackCell"]; @weakify(self) [[[cell.replyButton rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:cell.rac_prepareForReuseSignal] subscribeNext:^(UIButton *x) { @strongify(self) // 處置一些其他邏輯 [self.navigationController pushViewController:[SXReplyPage new] animated:YES]; }]; return cell; } // UICollectionViewDataSource - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell * cell = [collectionView dequeueReusableCellWithIdentifier:@"SXDownloadCell"]; [[[cell.changeBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:cell.rac_prepareForReuseSignal] subscribeNext:^(UIButton *x) { cell.backgroundColor = [UIColor grayColor]; }]; return cell; }
個中takeUntil操作是監聽某個事宜直到甚麼時刻停止。當這個cell行將重用時rac_prepareForReuseSignal到來會觸發disposable旌旗燈號停止監聽。
非重用類型的控件的性命周期可以用rac_willDeallocSignal 旌旗燈號監聽,然則在開辟中很少會用到此旌旗燈號,由於年夜多是旌旗燈號操作的外部代碼裡都幫你做了這個操作,即監聽一個事宜直到本身停止時停滯監聽。
// rac_textSignal源碼 - (RACSignal *)rac_textSignal { @weakify(self); return [[[[[RACSignal defer:^{ @strongify(self); return [RACSignal return:self]; }] concat:[self rac_signalForControlEvents:UIControlEventAllEditingEvents]] map:^(UITextField *x) { return x.text; }] takeUntil:self.rac_willDeallocSignal] setNameWithFormat:@"%@ -rac_textSignal", self.rac_description]; } // rac_signalForControlEvents源碼 - (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents { @weakify(self); return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) { @strongify(self); [self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ [subscriber sendCompleted]; }]]; return [RACDisposable disposableWithBlock:^{ @strongify(self); [self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; }]; }] setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", self.rac_description, (unsigned long)controlEvents]; }
關於ReactiveCocoa代碼理論之-UI組件的RAC旌旗燈號操作就給年夜家引見這麼多,願望對年夜家有所贊助!