ReactiveObjC使用

来源:https://www.cnblogs.com/xuzb/archive/2018/04/11/8793792.html
-Advertisement-
Play Games

ReactiveObjC使用 ReactiveCocoa是Github開源的一個用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱。敢自稱為XXXCocoa框架可以想象到這個框架的牛逼! 現在分為ReactiveObjC和ReactiveSwift,兩個框架的功能使用相似,本文主要介紹Re ...


ReactiveObjC使用

ReactiveCocoa是Github開源的一個用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱。敢自稱為XXXCocoa框架可以想象到這個框架的牛逼!

現在分為ReactiveObjC和ReactiveSwift,兩個框架的功能使用相似,本文主要介紹ReactiveObjC的簡單使用,希望能對你有所幫助......

ReactiveObjC框架的簡單使用

 如果是第一次使用,建議先簡單測試通過後,再使用...... (你懂的) ReactiveObjC框架的簡單介紹

#pragma mark -- 監聽事件(按鈕點擊)

原理:將系統的UIControlEventTouchUpInside事件轉化為信號、我們只需要訂閱該信號就可以了。

點擊按鈕的時候觸發UIControlEventTouchUpInside事件---> 發出信號 實際是:  執行訂閱者(subscriber)的sendNext方法

 

 
// 外界使用
[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
    //x 就是被點擊的按鈕
    NSLog(@"按鈕被點擊了%@", x);
}];

 

圖例:

 

 

#pragma mark -- 代替代理

需求:自定義redView,監聽紅色view中按鈕點擊
之前都是需要通過代理監聽,給紅色View添加一個代理屬性,點擊按鈕的時候,通知代理做事情,符合封裝的思想。
rac_signalForSelector:把調用某個對象的方法的信息轉換成信號(RACSubject),就會調用這個方法,就會發送信號。
這裡表示只要監聽了redView的btnClick:方法。(只要redView的btnClick:方法執行了,就會執行下麵的方法,並且將參數傳遞過來)

 
[[redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
  NSLog(@"點擊紅色視圖中的按鈕", x);
}];

 

#pragma mark -- 代替KVO

// 把監聽redView的center屬性改變轉換成信號,只要值改變就會發送信號
// observer:可以傳入nil

 
[[redView rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {

NSLog(@"%@",x);

}];

 

#pragma mark -- 代替通知

// 把監聽到的通知轉換信號

 
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@", x);
}];

 

#pragma mark -- 監聽文本框的文字改變


// 監聽文本框的文字改變、獲取文本框文字改變的信號

 
[_textField.rac_textSignal subscribeNext:^(id x) {
self.textLabel.text = x;
NSLog(@"文字改變了%@",x);
}];

 

#pragma mark -- 處理多個請求

// 處理多個請求,都返回結果的時候,統一做處理.
RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {

// 發送請求1
[subscriber sendNext:@"發送請求1"];
return nil;
}];

RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// 發送請求2
[subscriber sendNext:@"發送請求2"];
return nil;
}];

// 使用註意:幾個信號,selector的方法就幾個參數,每個參數對應信號發出的數據。
不需要訂閱:不需要主動訂閱,內部會主動訂閱
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];

// 更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{
NSLog(@"更新UI%@ %@",data,data1);
}

 

#pragma mark -- 遍曆數組


// 1.遍曆數組
NSArray *numbers = @[@1,@2,@3,@4];

// 這裡其實是三步(底層已經封裝好了,直接使用就行)
// 第一步: 把數組轉換成集合RACSequence numbers.rac_sequence
// 第二步: 把集合RACSequence轉換RACSignal信號類,numbers.rac_sequence.signal
// 第三步: 訂閱信號,激活信號,會自動把集合中的所有值,遍歷出來。

 
[numbers.rac_sequence.signal subscribeNext:^(id x) {

// NSLog(@"%@",x);
}];

 

***********************************************RAC常用巨集*****************************************

#pragma mark--KVO

RACObserve(就是一個巨集定義):快速的監聽某個對象的某個屬性改變
監聽self.view的center屬性,當center發生改變的時候就會觸發NSLog方法

 
[RACObserve(self.view, center) subscribeNext:^(id x) {
NSLog(@"%@", x);
}];

 

#pragma mark--登錄按鈕的狀態實時監聽

 
RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){
return @(username.length && password.length);
}];

 

#pragma mark--迴圈引用

// @weakify() 巨集定義
@weakify(self) //相當於__weak typeof(self) weakSelf = self;

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
@strongify(self)  //相當於__strong typeof(weakSelf) strongSelf = weakSelf;
NSLog(@"%@",self.view);
return nil;
}];
_signal = signal;

 

實際開發遇到的坑

一: "引用迴圈"是肯定會出現的,因此一定要避免"強引用迴圈"

解決方案:一端使用strong一端使用weak

二: 出現下麵的錯誤:

 

 

解決辦法:所有控制項在使用RAC之前一定要先初始化!先初始化!先初始化!

(Masonry框架:佈局之前一定要添加到父控制項中)有相似之處


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL主從複製報錯如下: 2018-04-11 09:11:16 2400 [Note] Slave SQL thread initialized, starting replication in log 'binlog.000042' at position 1934531, relay lo ...
  • 1,寫的第一個觸發器 CREATE OR REPLACE TRIGGER TRIG_HNDX_YXDM --床位信息表更新時,更新xsxxb的yxdm欄位(取樓棟信息表xg_gygl_new_ldxxb的xqdm) after update on xg_gygl_new_cwxxb for each ...
  • 前面的話 本文將詳細介紹一款用nodejs開發的基於Web的mongodb資料庫管理工具mongo-express 安裝 首先,全局安裝 mongo-express 包 接著,使用如下命令來找到mongo-express的安裝目錄 在win10下的輸出結果是: 然後進入該目錄下的node_modul ...
  • SQL query practice with MySQL [toc] 0.create table / Navicat Premium Data Transfer Source Server : localhost Source Server Type : MySQL Source Server ...
  • iPhone / iOS SDK 最酷的特性之一就是應用將其自身”綁定”到一個自定義 URL scheme 上,該 scheme 用於從瀏覽器或其他應用中啟動本應用。 註冊自定義 URL Scheme 註冊自定義 URL Scheme 的第一步是創建 URL Scheme — 在 Xcode Pro ...
  • 首先說:小米的垃圾支持.我在支持頁面上看著 miuiV4或V5版本,再看我手機上9.5的版本.就感覺有些不妙. 下載下來後,點擊安裝程式,提示我安裝空間不足......我F盤可用空間140G,不夠你造的? 最後解決辦法: 首先保證你的手機開了開發者模式 和 USB調試 還有USB安裝. 下載360手 ...
  • 首先,介紹一下UIView相關的動畫。 動畫屬性設置: 舉2個例子: 2. UIView Block動畫 這3個動畫比較簡單,不再多做敘述。 Spring動畫ios7.0以後新增了Spring動畫(IOS系統動畫大部分採用Spring Animation, 適用所有可被添加動畫效果的屬性) Keyf ...
  • 蘋果開發者賬號中,測試機器列表達到100臺上限,想要刪除一些設備、添加新設備,怎麼辦? 我們公司規模比較大,項目也比較多,最近就遇到了開發過程中發現新的iPhone添加不到測試設備中,在蘋果開發者中心添加新設備給予下麵的提示 意思是說測試設備已達到100台的上限,於是以為把原來添加的設備“Disab ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...