RAC之RACCommand簡單學(xué)習(xí)

- (IBAction)test:(id)sender {

? ? [selftest5];

? ? return;

? ? // RACCommand: 處理事件

? ? // 不能返回空的信號

? ? // 1.創(chuàng)建命令

? ? RACCommand*command = [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input) {

?? ? ? //block調(diào)用,直行行命令的時候就會調(diào)用

? ? ? ? NSLog(@"執(zhí)行命令傳進來的參數(shù)==%@",input); // input 為執(zhí)行命令傳進來的參數(shù)


? ? ? ? return [RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber) {

? ? ? ? ? ? [subscribersendNext:@"執(zhí)行命令產(chǎn)生的數(shù)據(jù)"];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];

? ? // 如何拿到執(zhí)行命令中產(chǎn)生的數(shù)據(jù)呢?

? ? // 訂閱命令內(nèi)部的信號

? ? // ** 方式一:直接訂閱執(zhí)行命令返回的信號


? ? // 2.執(zhí)行命令

? ? RACSignal *signal =[command execute:@{@"key":@2,@"key2":@3}]; // 這里其實用到的是replaySubject 可以先發(fā)送命令再訂閱

? ? // 在這里就可以訂閱信號了

? ? @weakify(self);

? ? [signalsubscribeNext:^(idx) {

? ? ? ? NSLog(@"%@",x);


? ? ? ? @strongify(self);

? ? ? ? self.contentL.text= x;

? ? }];


}

// RACCommand:RAC中用于處理事件的類罕模,可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞霞捡,包裝到這個類中,他可以很方便的監(jiān)控事件的執(zhí)行過程薄疚,比如看事件有沒有執(zhí)行完畢

// 使用場景:監(jiān)聽按鈕點擊,網(wǎng)絡(luò)請求

- (void)viewDidLoad {

? ? [super viewDidLoad];

? ? // Do any additional setup after loading the view.

}

// 方式二:

// 訂閱信號

// 注意:這里必須是先訂閱才能發(fā)送命令

// executionSignals:信號源赊琳,信號中信號街夭,signalofsignals:信號,發(fā)送數(shù)據(jù)就是信號

-(void)test1{

? ? RACCommand*command= [[RACCommand alloc]initWithSignalBlock:^RACSignal * _Nonnull(id? _Nullable input) {

? ? ? ? NSLog(@"執(zhí)行命令傳進來的參數(shù)==%@",input); // input 為執(zhí)行命令傳進來的參數(shù)

? ? ? ? return [RACSignal createSignal:^RACDisposable * _Nullable(id? _Nonnull subscriber) {

? ? ? ? ? ? [subscribersendNext:@"產(chǎn)生的數(shù)據(jù)"];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];

? ? @weakify(self);

? ? [command.executionSignals subscribeNext:^(RACSignal? *x) {

? ? ? ? [xsubscribeNext:^(id? _Nullablex) {

? ? ? ? ? ? NSLog(@"%@",x);


? ? ? ? ? ? @strongify(self);

? ? ? ? ? ? self.contentL.text= x;

? ? ? ? }];

? ? }];

? ? // 2.執(zhí)行命令

? ? [commandexecute:@2];


}

// 高級做法

- (void)test3 {


? ? // 1.創(chuàng)建命令

? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

? ? ? ? // block調(diào)用:執(zhí)行命令的時候就會調(diào)用

? ? ? ? NSLog(@"%@", input);

? ? ? ? // 這里的返回值不允許為nil

? ? ? ? return [RACSignal createSignal:^RACDisposable *(id subscriber) {

? ? ? ? ? ? [subscribersendNext:@"發(fā)送信號"];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];


? ? // 方式三

? ? // switchToLatest獲取最新發(fā)送的信號躏筏,只能用于信號中信號板丽。

? ? [command.executionSignals.switchToLatest subscribeNext:^(id x) {

? ? ? ? NSLog(@"%@", x);

? ? }];

? ? // 2.執(zhí)行命令

? ? [commandexecute:@3];


}

// switchToLatest

- (void)test4 {

? ? // 創(chuàng)建信號中信號

? ? RACSubject*signalofsignals = [RACSubjectsubject];

? ? RACSubject *signalA = [RACSubject subject];

? ? // 訂閱信號

? ? //? ? [signalofsignals subscribeNext:^(RACSignal *x) {

? ? //? ? ? ? [x subscribeNext:^(id x) {

? ? //? ? ? ? ? ? NSLog(@"%@", x);

? ? //? ? ? ? }];

? ? //? ? }];

? ? // switchToLatest: 獲取信號中信號發(fā)送的最新信號

? ? [signalofsignals.switchToLatestsubscribeNext:^(idx) {

? ? ? ? NSLog(@"%@", x);

? ? }];

? ? // 發(fā)送信號

? ? [signalofsignalssendNext:signalA];

? ? [signalAsendNext:@4];

}

// 監(jiān)聽事件有沒有完成

- (void)test5 {

? ? //注意:當前命令內(nèi)部發(fā)送數(shù)據(jù)完成,一定要主動發(fā)送完成

? ? // 1.創(chuàng)建命令

? ? RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {

? ? ? ? // block調(diào)用:執(zhí)行命令的時候就會調(diào)用

? ? ? ? NSLog(@"%@", input);

? ? ? ? // 這里的返回值不允許為nil

? ? ? ? return [RACSignal createSignal:^RACDisposable *(id subscriber) {

? ? ? ? ? ? // 發(fā)送數(shù)據(jù)

? ? ? ? ? ? [subscribersendNext:@"執(zhí)行命令產(chǎn)生的數(shù)據(jù)"];


? ? ? ? ? ? // *** 發(fā)送完成 **

? ? ? ? ? ? [subscribersendCompleted];

? ? ? ? ? ? returnnil;

? ? ? ? }];

? ? }];

? ? // 監(jiān)聽事件有沒有完成

? ? [command.executing subscribeNext:^(id x) {

? ? ? ? if([xboolValue] ==YES) {// 正在執(zhí)行

? ? ? ? ? ? NSLog(@"當前正在執(zhí)行%@", x);

? ? ? ? }else{

? ? ? ? ? ? // 執(zhí)行完成/沒有執(zhí)行

? ? ? ? ? ? NSLog(@"執(zhí)行完成/沒有執(zhí)行");

? ? ? ? }

? ? }];


? ? // 2.執(zhí)行命令

? ? [commandexecute:@1];


}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市埃碱,隨后出現(xiàn)的幾起案子猖辫,更是在濱河造成了極大的恐慌,老刑警劉巖砚殿,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啃憎,死亡現(xiàn)場離奇詭異,居然都是意外死亡似炎,警方通過查閱死者的電腦和手機辛萍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羡藐,“玉大人贩毕,你說我怎么就攤上這事∑袜拢” “怎么了辉阶?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘩扼。 經(jīng)常有香客問我谆甜,道長,這世上最難降的妖魔是什么邢隧? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任店印,我火速辦了婚禮,結(jié)果婚禮上倒慧,老公的妹妹穿的比我還像新娘按摘。我一直安慰自己,他們只是感情好纫谅,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布炫贤。 她就那樣靜靜地躺著,像睡著了一般付秕。 火紅的嫁衣襯著肌膚如雪兰珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天询吴,我揣著相機與錄音掠河,去河邊找鬼。 笑死猛计,一個胖子當著我的面吹牛唠摹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奉瘤,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼勾拉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藕赞,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤成肘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后斧蜕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體双霍,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年惩激,在試婚紗的時候發(fā)現(xiàn)自己被綠了店煞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡风钻,死狀恐怖顷蟀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骡技,我是刑警寧澤鸣个,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站布朦,受9級特大地震影響囤萤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜是趴,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一涛舍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唆途,春花似錦富雅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至温赔,卻和暖如春蛤奢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陶贼。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工啤贩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拜秧。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓瓜晤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腹纳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容