ReactiveCocoa

RedRain 의:http://www.jianshu.com/users/29e03e6ff407/latest_articles
1,ReactiveCocoa
RAC 는 GitHub 오픈 소스 의 프레임 워 크 입 니 다.
2, ReactiveCocoa 작용
프레임 워 크 가 특수 처리 되 었 습 니 다: action, delegate, KVO, callback: 단추 의 target - action 을 한데 모 아 UI 논리 처리 코드 를 한데 모 을 수 있 습 니 다.
3. 프로 그래 밍 사상
개발 과정 에서 우 리 는 특정한 프레임 워 크 에 너무 의존 해 서 는 안 된다. 그렇지 않 으 면 이 프레임 워 크 가 업데이트 되 지 않 아 프로젝트 후기 에 유지 할 수 없 기 때문에 하나의 프레임 워 크 를 배 울 필요 가 있다 .
3.1 프로 세 스 지향
일 을 처리 하 는 것 은 과정 을 핵심 으로 하여 한 걸음 한 걸음 실현 된다.
3.2 대상 지향
만물 이 모두 대상 이다.
3.3 체인 프로 그래 밍 사상
여러 작업 을 . 을 통 해 연결 하여 코드 의 가 독성 을 향상 시 킵 니 다.
a(1).b(2).c(3)

특징:
방법의 반환 값 은 block 입 니 다. block 은 반환 값 (대상 자체), block 매개 변수 (처리 해 야 할 값) 가 있어 야 합 니 다.
그 중에서 대표 적 인 틀 masrony3.4 응답 식 프로 그래 밍 사상
호출 순 서 를 고려 할 필요 가 없다. 결 과 를 알 아야 한다. 나비 효과 와 비슷 하고 하나의 사건 이 발생 하면 큰 영향 을 줄 수 있다. 이런 사건 들 이 흐름 처럼 전파 되 고 결과 에 영향 을 주 며 대상 을 대상 으로 하 는 한 마디 를 빌려 만물 이 모두 흐른다.
  • 대표: KVO 운용
  • 3.5 함수 식 프로 그래 밍 사상
    조작 을 가능 한 한 일련의 끼 워 넣 는 함수 나 방법 으로 호출 하 는 것 이다.
    본질:
    방법 에 block 을 전송 하 는 것 입 니 다. 방법 에 block 호출 을 삽입 하여 코드 를 모 아서 관리 하 는 것 입 니 다.
    특징:
    모든 방법 은 반환 값 (대상 자체) 이 있 습 니 다. 함수 나 Block 을 매개 변수 로 하고 block 매개 변수 (조작 해 야 할 값) block 반환 값 (조작 결과) 이 있 습 니 다.
    대표:
    ReactiveCocoa
    4.ReactiveCocoa
    4.1 RACSignal
    데이터 가 생기 면 RACSignal 을 사용 합 니 다.
  • 1, 신호 생 성 (냉 신호)
  • 2, 구독 신호 (열 신호)
  • 3, 신호 보 내기
  • 4.2 RACDisposable
    구독 을 취소 하거나 자원 을 정리 하 는 데 사 용 됩 니 다. 신호 전송 이 완료 되 거나 오류 가 발생 하면 자동 으로 트리거 됩 니 다.
  • 사용 장면: 어떤 신 호 를 감청 하고 싶 지 않 을 때 구독 신 호 를 자발적으로 취소 할 수 있다.
  • 신 호 를 생 성 하 는 반환 값 에서 RACDisposable 대상 을 되 돌려 줍 니 다. 이 Block 대상 을 만 들 면 신 호 를 구독 한 후 이 block 을 호출 합 니 다. 외부 에서 이 Disposable 대상 을 강하 게 인용 하면 이 Disposable block 을 자동 으로 호출 하지 않 지만 signal 의 subscribe Next 방법 으로 대상 을 되 돌려 줍 니 다.disposable 은 dispose 방법 을 주동 적 으로 호출 하여 이 Block 을 촉발 합 니 다.
    4.3 RACSubject
    신호 제공 자 는 자신 이 신 호 를 충당 할 수도 있 고 신 호 를 보 낼 수도 있다.
  • 장면 사용: 보통 대 리 를 대체 하고 그것 이 있 으 면 대 리 를 정의 할 필요 가 없다.
  • RACSubject 에서 신 호 를 보 내 는 방식 은 Signal 과 다 릅 니 다. 그의 작업 절차 에서 subscribe Next 는 Next block 코드 만 저장 되 어 있 습 니 다. subject 의 SendNext 에 서 는 subject 의 모든 구독 자 를 옮 겨 다 니 며 모든 구독 자 에 게 메 시 지 를 보 냅 니 다.
    4.4 RACReplaySubject
    신호 클래스, RACSubject 의 하위 클래스 를 중복 제공 합 니 다. , 1,2,3
  • 1, 신호 생 성
  • 2, 구독 신호: 모든 sendNext 에 저 장 된 값 을 옮 겨 다 니 며 현재 구독 자 에 게 데 이 터 를 보 냅 니 다.
  • 3. 신 호 를 보 냅 니 다. 먼저 이 값 을 저장 하고 모든 구독 자 를 옮 겨 다 니 며 데 이 터 를 보 냅 니 다.
  • 모든 이 종 류 는 먼저 신 호 를 보 낸 다음 에 신 호 를 구독 할 수 있다.
    4.5 RACTuple
    원조 류, NSArray 와 유사 하여 포장 값 에 사용 합 니 다.
    4.6 RACSequence
    RAC 의 집합 클래스 는 NSArray, NSDictionary 대신 배열 과 사전 을 빠르게 옮 길 수 있 습 니 다.
  • 사용 장면: 사전 회전 모델.
  • NSArray 를 Sequence 로 변환
        NSArray *arr = @[@"123",@"123",@"123",@"123"];
        
        [arr.rac_sequence.signal subscribeNext:^(id x) {
            NSLog(@"%@",x);
        }];
        
    

    이 방법 은 배열 의 모든 값 을 직접 옮 겨 다 니 며 구독 합 니 다. sendNext 방법 은 필요 없습니다.
    NSDictionary 를 Sequence 로 변환
        NSDictionary *dic = @{@"name":@"123",@"age":@"123"};
        
        [dic.rac_sequence.signal subscribeNext:^(RACTuple *x) {
            
            NSString *key0 = x[0];
            NSString *value0 = x[1];
            NSLog(@"key0:%@ ,value0:%@",key0,value0);
    
            
            RACTupleUnpack(NSString *key1, NSString *value1) = x;
            NSLog(@"key1:%@ ,value1:%@",key1,value1);
            
            
        }];
    
    

    인쇄 된 정보:
     key0:name ,value0:123
     key1:name ,value1:123
     key0:age ,value0:123
     key1:age ,value1:123
     
    

    응용 사전 회전 모델
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"source.plist" ofType:nil];
        NSArray *dicArr = [NSArray arrayWithContentsOfFile:filePath];
        
        NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:3];
        [dicArr.rac_sequence.signal subscribeNext:^(NSDictionary  *x) {
           
            SourceModel *model = [[SourceModel alloc]init];
            model.name = x[@"name"];
            model.age = x[@"age"];
            [mArr addObject:model];
            
        }];
    
    

    지도
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"source.plist" ofType:nil];
        NSArray *dicArr = [NSArray arrayWithContentsOfFile:filePath];
        
    
        NSArray *modelArray = [[dicArr.rac_sequence map:^id(NSDictionary *value) {
         
            SourceModel *model = [[SourceModel alloc]init];
            model.name = x[@"name"];
            model.age = x[@"age"];
           
            return model;
        }] array];
    
    

    5. ReactiveCocoa 개발 에서 흔히 볼 수 있 는 용법
    5.1 대체 에이전트
  • RACSubject
  • rac_signal ForSelector: 어떤 방법 이 신호 로 바 뀌 었 는 지 감청 하면 구독 할 수 있 습 니 다
  •     [[self rac_signalForSelector:@selector(didReceiveMemoryWarning)] 
            subscribeNext:^(id x) {
            
        }];
    
    
    

    5.2 KVO 대신
    1. rac_observeKeyPath
    #import "NSObject+RACKVOWrapper.h"
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        [self.view rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
            
        }];
        
        
    }
    
    

    2. rac_valuesForKeyPath
    이 방법 은 감청 변 화 를 하나의 신호 로 바 꾸 어 신호 가 되면 구독 할 수 있다.
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        [[self.view rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id x) {
            
        }];
        
        
    }
    
    

    5.3 감청 사건
    감청 버튼 클릭 이벤트
        UIButton *btn = [[UIButton alloc]init];
        
        [[btn rac_signalForControlEvents:UIControlEventTouchUpInside]
            subscribeNext:^(id x) {
            
        }];
    
    

    5.4 알림 대신
        [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] 
            subscribeNext:^(id x) {
            
        }];
    
    

    5.5 감청 텍스트 상자
    텍스트 상자 의 내용 변 화 를 하나의 신호 로 바 꾸 어 구독 합 니 다.
        UITextField *field = [UITextField new];
        [field.rac_textSignal subscribeNext:^(id x) {
            
        }];
    
    

    5.6 처리 인터페이스 에 여러 번 요청 이 있 을 때 데 이 터 를 가 져 와 야 화면 을 보 여 줍 니 다.
  • rac_liftSelector:withSignalsFromArray:

  • 이 방법 에서 두 번 째 매개 변 수 는 신호 배열 에 전달 되 고 대응 하 는 첫 번 째 매개 변수의 반전 방법 은 몇 개의 매개 변수 와 대응 해 야 한다.
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        
        RACSignal *sin1 = [RACSignal createSignal:^RACDisposable *(id subscriber) {
           
            
            [subscriber sendNext:@"      "];
            
            return nil;
        }];
        
        RACSignal *sin2 = [RACSignal createSignal:^RACDisposable *(id subscriber) {
            
            
            [subscriber sendNext:@"       "];
            
            return nil;
        }];
        
        //                sendNext ,    selector.
        [self rac_liftSelector:@selector(updateUIWithData1:data2:) withSignalsFromArray:@[sin1,sin2]];
    }
    
    - (void)updateUIWithData1:(NSString *)stringFirst data2:(NSString *)stringSecound{
        
        
         /**
         *                     .
         */
        NSLog(@"sin1Send:%@  sin2Send:%@",stringFirst,stringSecound);
    
    }
    
    

    6. ReactiveCocoa 에서 흔히 볼 수 있 는 매크로
    6.1 RAC()
    어떤 대상 에 게 사용 되 는 특정한 속성 바 인 딩 신 호 는 신호 내용 이 생기 면 내용 을 속성 에 할당 합 니 다.
    
        UILabel *label = [UILabel new];
        UITextField *textField = [UITextField new];
        
        //     
        [textField.rac_textSignal subscribeNext:^(id x) {
           
            label.text = x;
            
        }];
        
        // RAC   
        //                 ,         ,           .
        RAC(label,text) = textField.rac_textSignal;
    
    

    6.2 RACObserve(, )
      // 1,          
        [self.view rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
        
            NSLog(@"%@",value);
        }];
        
        
        // 2,RACObserve
        [RACObserve(self.view, frame) subscribeNext:^(id x) {
           
            NSLog(@"%@", x);
        }];
    
    

    6.3 RACTuplePack 과 RACTupleUnpack
    RACTuple *tuple = RACTuplePack(@1,@2);
    
    NSLog(@"%@", tuple[0]);
    
    RACTupleUnpack(NSNumber *number1, NSNumber *number2) = tuple;
    
    NSLog(@"%@  %@", number1, number2);
    

    7. RACMulticastConnection
    하나의 신호 가 여러 번 구독 되 었 을 때 신 호 를 만 들 때 여러 번 신 호 를 만 드 는 block 을 호출 하지 않도록 부작용 을 일 으 키 지 않도록 이러한 처 리 를 사용 할 수 있 습 니 다.RACMulticastConnection 이 종 류 는 RACSignalRACSubject 두 가지 종 류 를 결합 하여 사용한다.
    모든 구독 자 는 RACMulticastConnectionRACSubject 에 저장 되 어 있다.RACSubjectRACSignalRACSubscriber 로 사용 된다 sendNext.RACSubject sendNext 그 중의 모든 구독 자 를 옮 겨 다 닐 것 이다 sendNext
  • RACMulticastConnection 방법 connect 을 볼 수 있 습 니 다
  •     // 1,    
        RACSignal *sin = [RACSignal createSignal:^RACDisposable *(id subscriber) {
           
            NSLog(@"    ");
            
            [subscriber sendNext:@"    "];
            
            return nil;
        }];
        
        // 2,       
        RACMulticastConnection *connection = [sin publish];
        
        // 3,         .
        [connection.signal subscribeNext:^(id x) {
            NSLog(@"   1");
        }];
        
        [connection.signal subscribeNext:^(id x) {
            NSLog(@"   2");
    
        }];
        
        [connection.signal subscribeNext:^(id x) {
            NSLog(@"   3");
    
        }];
        
        // 4,    
        [connection connect];
    
    
    

    8. RACCommand
    RAC 에서 사건 을 처리 하 는 클래스 는 사건 을 어떻게 처리 하 는 지, 사건 의 데 이 터 를 어떻게 전달 하 는 지, 이런 클래스 에 포장 하면 사건 의 집행 과정 을 편리 하 게 감시 할 수 있다.
  • 사용 장면: , .
  •     RACCommand *command = [[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) {
           
            
            NSLog(@"%@",input);
            
            
            return [RACSignal createSignal:^RACDisposable *(id subscriber) {
               
                [subscriber sendNext:@1];
                
                //      ,     sendCompleted.
                //      command.executing  bool .
                [subscriber sendCompleted];
                
                return nil;
            }];
        }];
        
        
        [command.executionSignals subscribeNext:^(RACSignal *x) {
           
            [x subscribeNext:^(id x) {
                
                NSLog(@"xxxx111:%@",x);
    
                
            }];
            
        }];
        
        [command.executionSignals.switchToLatest subscribeNext:^(id x) {
            
            
            NSLog(@"xxxx222:%@",x);
    
        }];
        
        
        
        [command.executing subscribeNext:^(id x) {
           
            if ([x boolValue] == YES) {
                
                //       
                NSLog(@"    .");
            }else{
                NSLog(@"    /    ");
            }
            
        }];
        
        [command execute:@100];
    
    

    대응 하 는 인쇄 정보
        /    
    100
        .
    xxxx111:1
    xxxx222:1
        /    
    
    

    좋은 웹페이지 즐겨찾기