ReactiveCocoa
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 매개 변수 (처리 해 야 할 값) 가 있어 야 합 니 다.
그 중에서 대표 적 인 틀
masrony
3.4 응답 식 프로 그래 밍 사상호출 순 서 를 고려 할 필요 가 없다. 결 과 를 알 아야 한다. 나비 효과 와 비슷 하고 하나의 사건 이 발생 하면 큰 영향 을 줄 수 있다. 이런 사건 들 이 흐름 처럼 전파 되 고 결과 에 영향 을 주 며 대상 을 대상 으로 하 는 한 마디 를 빌려 만물 이 모두 흐른다.
조작 을 가능 한 한 일련의 끼 워 넣 는 함수 나 방법 으로 호출 하 는 것 이다.
본질:
방법 에 block 을 전송 하 는 것 입 니 다. 방법 에 block 호출 을 삽입 하여 코드 를 모 아서 관리 하 는 것 입 니 다.
특징:
모든 방법 은 반환 값 (대상 자체) 이 있 습 니 다. 함수 나 Block 을 매개 변수 로 하고 block 매개 변수 (조작 해 야 할 값) block 반환 값 (조작 결과) 이 있 습 니 다.
대표:
ReactiveCocoa
4.ReactiveCocoa
4.1 RACSignal
데이터 가 생기 면 RACSignal 을 사용 합 니 다.
구독 을 취소 하거나 자원 을 정리 하 는 데 사 용 됩 니 다. 신호 전송 이 완료 되 거나 오류 가 발생 하면 자동 으로 트리거 됩 니 다.
4.3 RACSubject
신호 제공 자 는 자신 이 신 호 를 충당 할 수도 있 고 신 호 를 보 낼 수도 있다.
Next
block 코드 만 저장 되 어 있 습 니 다. subject 의 SendNext 에 서 는 subject 의 모든 구독 자 를 옮 겨 다 니 며 모든 구독 자 에 게 메 시 지 를 보 냅 니 다.4.4 RACReplaySubject
신호 클래스, RACSubject 의 하위 클래스 를 중복 제공 합 니 다.
, 1,2,3
4.5 RACTuple
원조 류, NSArray 와 유사 하여 포장 값 에 사용 합 니 다.
4.6 RACSequence
RAC 의 집합 클래스 는 NSArray, NSDictionary 대신 배열 과 사전 을 빠르게 옮 길 수 있 습 니 다.
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 대체 에이전트
[[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 처리 인터페이스 에 여러 번 요청 이 있 을 때 데 이 터 를 가 져 와 야 화면 을 보 여 줍 니 다.
이 방법 에서 두 번 째 매개 변 수 는 신호 배열 에 전달 되 고 대응 하 는 첫 번 째 매개 변수의 반전 방법 은 몇 개의 매개 변수 와 대응 해 야 한다.
- (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
이 종 류 는 RACSignal
과 RACSubject
두 가지 종 류 를 결합 하여 사용한다.모든 구독 자 는
RACMulticastConnection
의 RACSubject
에 저장 되 어 있다.RACSubject
는 RACSignal
의 RACSubscriber
로 사용 된다 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
/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.