1. 程式人生 > >ReactiveCocoa之RAC常用巨集(十)

ReactiveCocoa之RAC常用巨集(十)

/**
 *  RAC有許多強大而方便的巨集。
 */

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self testAndtest2];
    
}

/**
 *RAC巨集
 */
- (void)test
{
    // RAC:把一個物件的某個屬性繫結一個訊號,只要發出訊號,就會把訊號的內容給物件的屬性賦值
    // 給label的text屬性綁定了文字框改變的訊號
    RAC(self.label, text) = self.textField.rac_textSignal;
//    [self.textField.rac_textSignal subscribeNext:^(id x) {
//        self.label.text = x;
//    }];

}

/**
 *  KVO
 *  RACObserveL:快速的監聽某個物件的某個屬性改變
 *  返回的是一個訊號,物件的某個屬性改變的訊號
 */
- (void)test2 {
    [RACObserve(self.view, center) subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
}
- (void)testAndtest2 // textField輸入的值賦值給label,監聽label文字改變,
{
    
    RAC(self.label, text) = self.textField.rac_textSignal;
    [RACObserve(self.label, text) subscribeNext:^(id x) {
        NSLog(@"====label的文字變了");
    }];
    
}

/**
 *  迴圈引用問題
 */
- (void)test3 {
    @weakify(self)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        @strongify(self)
        NSLog(@"%@",self.view);
        return nil;
    }];
    _signal = signal;
}

/**
 * 元祖
 * 快速包裝一個元組
 * 把包裝的型別放在巨集的引數裡面,就會自動包裝
 */
- (void)test4 {
    RACTuple *tuple = RACTuplePack(@1,@2,@4);
    // 巨集的引數型別要和元祖中元素型別一致, 右邊為要解析的元祖。
    RACTupleUnpack_(NSNumber *num1, NSNumber *num2, NSNumber * num3) = tuple;// 4.元祖
    // 快速包裝一個元組
    // 把包裝的型別放在巨集的引數裡面,就會自動包裝
    NSLog(@"%@ %@ %@", num1, num2, num3);
    
}