一.ReactiveCocoa(簡稱為RAC)是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框架,Cocoa是蘋果整套框架的簡稱,因此很多蘋果框架喜歡以Cocoa結(jié)尾。
我也是才剛剛學習,將學到的東西記錄下來:
- 1.RAC中RACSignal信號類是核心:
1.1創(chuàng)建一個信號:
創(chuàng)建信號:
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
發(fā)送信號
[subscriber sendNext:@"五哥最帥"];
取消信號,如果信號想被取消,就必須返回一個RACDisposable
信號什么時候被取消:
1.自動取消,當一個信號的訂閱者被銷毀的時候就會自動取消訂閱
2.手動取消.
block什么時候調(diào)用:一旦這個信號被取消和訂閱就會執(zhí)行block內(nèi)的代碼
block作用:當信號被取消的時候用于清空一些資源
return [RACDisposable disposableWithBlock:^{
NSLog(@"取消訂閱!!!");
}];
}];
訂閱信號:subscribeNext
把nextBlock保存到訂閱者里面
只要訂閱信號就會返回一個取消訂閱信號的類
RACDisposable *disposable = [signal subscribeNext:^(id x) {
NSLog(@"----- %@", x);
}];
取消訂閱
[disposable dispose];
RACSignal總結(jié):
- 1.核心:
- 1.1核心:信號類
- 1.2信號類的作用:只要有數(shù)據(jù)改變就會把數(shù)據(jù)包裝成信號傳遞出去.
- 1.3只要有數(shù)據(jù)改變就會信號發(fā)出.
- 1.4數(shù)據(jù)發(fā)出去,不是信號類發(fā)出去,信號類不能發(fā)送數(shù)據(jù)
二.使用方法:
- 2.1創(chuàng)建信號
- 2.2訂閱信號
- 2.3取消訂閱
三.實現(xiàn)思路:
- 3.1當一個信號被訂閱,創(chuàng)建訂閱者,并把nextBlock并存到訂閱者里面.
- 3.2創(chuàng)建的時候會返回[RACDynamicSignal createSignal:didSubscribe];
- 3.3調(diào)用RACDynamicSignal的didSubscribe
- 3.4發(fā)送信號[subscriber sendNext:value];
- 3.5拿到訂閱者的nextBlock調(diào)用
二:快速進行遍歷字典或者是數(shù)組:RACTupleUnpack宏:專門用來解析元祖
NSDictionary *dict = @{@"key1":@"One",@"key2":@"two",@"key3":@"three",@"key4":@"four",@"key5":@"five",@"key6":@"six",@"key7":@"seven",@"key8":@"engit",@"key9":@"nine"}; [dict.rac_sequence.signal subscribeNext:^(id x) {
- RACTupleUnpack等號右邊:需要解析元組宏的參數(shù),左邊:填解析什么的數(shù)據(jù)元組里面有幾個值,宏的參數(shù)必須填幾個
RACTupleUnpack(NSString *key, NSString *value) = x;
NSLog(@"key = %@, --- value = %@", key, value);
}
error:^(NSError *error) {
} completed:^{
}];
- 當有多個訂閱者,但是我們只想發(fā)送一個信號怎么辦?
RACMulticastConnection 我們用這個就可以實現(xiàn)了.
- 第一種寫法(普通寫法:這樣的缺點是:每訂閱一次信號就得重新創(chuàng)建并發(fā)送請求,這樣很不友好)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
[subscriber sendNext:@"ws"];
NSLog(@"發(fā)送請求啦");
return [RACDisposable disposableWithBlock:^{
NSLog(@"qqqqqqqq");
}];
}];
訂閱信號(我下面訂閱的三次信號,通過打印可以知道,signal一共創(chuàng)建了三次).
[signal subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
[signal subscribeNext:^(id x) {
NSLog(@"x = %@", x);
}];
RACDisposable *disposable = [signal subscribeNext:^(id x) {
NSLog(@"ss = %@", x);
}];
//取消訂閱
[disposable dispose];
}
- 使用這種方法來解決上面出現(xiàn)的問題
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
比較好的做法,使用RACMulticastConnection,無論多少個訂閱者,無論訂閱多少次,我只創(chuàng)建一個信號并只發(fā)送一次.
發(fā)送請求用一個信號內(nèi)包裝,不管有多少個訂閱者,只想發(fā)送一次請求;
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
NSLog(@"發(fā)送信號了!!!");
[subscriber sendNext:@"發(fā)送信號!"];
return [RACDisposable disposableWithBlock:^{
NSLog(@"取消訂閱");
}];
}];
1.創(chuàng)建連接類:
RACMulticastConnection *connection = [signal publish];
2.訂閱信號:
[connection.signal subscribeNext:^(id x) {
NSLog(@"1 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"2 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"3 = %@", x);
}];
[connection.signal subscribeNext:^(id x) {
NSLog(@"4 = %@", x);
}];
3.連接,只有連接了才會把信號源變?yōu)闊嵝盘?
[connection connect];
4.看打印發(fā)現(xiàn)信號類只創(chuàng)建了一次666666
RACDisposable *disposable = [connection.signal subscribeNext:^(id x) {
NSLog(@"apapapa");
}];
[disposable dispose];
}
持續(xù)更新............