RACSignal的一些常用用法

来源:https://www.cnblogs.com/lurenq/archive/2018/02/25/8469076.html
-Advertisement-
Play Games

NSData 嘗試這個例子之前,請在Demo工程的info.plist文件中加入App Transport Security Settings鍵值,並加入Allow Arbitrary Loads:YES鍵值對,用來開啟iOS下的非安全連接。 可以這樣用 map函數 如果我們使用NSData的rac ...


NSData + RACSupport.h

@interface NSData (RACSupport)

// Read the data at the URL using -[NSData initWithContentsOfURL:options:error:].
// Sends the data or the error.
// 返回一個URL非同步請求的信號量
// scheduler 不能為空
+ (RACSignal *)rac_readContentsOfURL:(NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler;

@end

 NSData

嘗試這個例子之前,請在Demo工程的info.plist文件中加入App Transport Security Settings鍵值,並加入Allow Arbitrary Loads:YES鍵值對,用來開啟iOS下的非安全連接。

 

可以這樣用

NSURL* url = [NSURL URLWithString:@"http://www.jianshu.com"];
RACSignal* getDataSignal = [NSData rac_readContentsOfURL:url options:NSDataReadingUncached
                                       scheduler:[RACScheduler mainThreadScheduler]];
[getDataSignal subscribeNext:^(id x) {
    NSLog(@"%@",x);  //這裡的x就是NSData數據
}];

 

map函數

如果我們使用NSDatarac_readContentsOfURL:url方法下載的是一張圖片,我們肯定希望這個Signal最後輸出的是UIImage對象,這裡就要用到非常常用的map函數。

map函數就像signal 管道上的中間處理器,從這裡走過的signal都會經過一段處理後,變成新的signal繼續傳輸。而這個處理過程則在map函數中由開發者決定。

將輸出NSDatasignal轉換為輸出UIImage

NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
RACSignal* getDataSignal = [NSData rac_readContentsOfURL:url options:NSDataReadingUncached
                                       scheduler:[RACScheduler mainThreadScheduler]];
    
//map函數進行轉換
RACSignal* getImageSignal = [getDataSignal map:^id(id value) {
        if (value) {
            return [UIImage imageWithData:value];
        }
        return nil;
}];
    
[getImageSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];

 

merge方法

接著我們提出一個新需求,同時請求三張不同的圖片,並將它們發送的信號合併成一條信號量。這裡就需要用到信號量的merge方法,如下

NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];
NSURL* url2 = [NSURL URLWithString:@"http://i3.hoopchina.com.cn/blogfile/201306/29/137247593017986.jpg"];
NSURL* url3 = [NSURL URLWithString:@"http://img.youxile.com/pic/1301/25170237170.jpg"];
RACSignal* getImageSignal1 = [[NSData rac_readContentsOfURL:url
                                                       options:NSDataReadingUncached
                                                     scheduler:[RACScheduler mainThreadScheduler]]
                                 map:^id(id value) {
        if (value) {
            return [UIImage imageWithData:value];
        }
        return nil;
}];
    
RACSignal* getImageSignal2 = [[NSData rac_readContentsOfURL:url2
                                                        options:NSDataReadingUncached
                                                      scheduler:[RACScheduler mainThreadScheduler]]
                                  map:^id(id value) {
                                      if (value) {
                                          return [UIImage imageWithData:value];
                                      }
                                      return nil;
                                  }];
    
RACSignal* getImageSignal3 = [[NSData rac_readContentsOfURL:url3
                                                        options:NSDataReadingUncached
                                                      scheduler:[RACScheduler mainThreadScheduler]]
                                  map:^id(id value) {
                                      if (value) {
                                          return [UIImage imageWithData:value];
                                      }
                                      return nil;
                                  }];

                                 
//合併操作
RACSignal* mergeSignal = [RACSignal merge:@[getImageSignal1,getImageSignal2,getImageSignal3]];
    
    [mergeSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];```

輸出如下:
2015-12-30 10:19:08.776 Fahu[1354:39991] <UIImage: 0x7f9ce2ac3730>, {450, 600}
2015-12-30 10:19:08.891 Fahu[1354:39991] <UIImage: 0x7f9ce2b02600>, {500, 687}
2015-12-30 10:19:09.098 Fahu[1354:39991] <UIImage: 0x7f9ce29a4500>, {500, 346}

 

###filter函數

網路也會有連不上的時候,三張圖片中如果有哪一張請求失敗,我們並不想讓`signal`發送`nil`值過來,可以使用filter函數對`signal`進行篩選。稍微改造一下上面的`mergeSignal`:
RACSignal* mergeSignal = [[RACSignal merge:@[getImageSignal1,getImageSignal2,getImageSignal3]] filter:^BOOL(id value) {

return @(!!value);
}];`

 

註意這裡的filter函數返回的是NSNumber型的BOOL值,YES是通過,NO時拒絕通過。

NSURLConnection

有了RAC,一些簡單的網路請求都可以不用AF框架了。

NSURLConnection+RACSupport.h

+ (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request;```

舉個例子,還是請求圖片
NSURL* url = [NSURL URLWithString:@"http://img1.gtimg.com/gamezone/pics/24159/24159840.jpg"];

NSURLRequest* request = [NSURLRequest requestWithURL:url];
RACSignal* connectionSignal = [NSURLConnection rac_sendAsynchronousRequest:request];
[connectionSignal subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];`

輸出

 <RACTuple: 0x7f826c071c00>  ...省略```

註意,這個`signal`發送的信號量是一個`RACTuple`對象。

###RACTuple

`RACTuple`(元組)類,是`RAC`中專門用來返回多個返回值的類,這個設計很像swift中的元組。

上面例子中的`RACTuple`有兩個返回值,`x[0]`是http response的頭部信息,`x[1]`是請求返回的數據,是一個`NSData`對象。元組類對象的讀取方法和數組相同。

 

 

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

-Advertisement-
Play Games
更多相關文章
  • 本文翻譯之MongoDB官網博客,原地址:https://www.mongodb.com/blog/post/enabling-ip-security-for-mongodb-36-on-ubuntu MongoDB3.6的預設配置會拒絕未授權的鏈接對公共網路的訪問,從而保護數據收到外部威脅。Mon ...
  • 資料庫的相關介紹 ...
  • 1. 模式的創建 2. 設置預設值 3. 基本表的撤銷 註:撤銷表時,資料庫中不應該存在依賴於被刪除表的其它表、視圖、索引、存儲過程等對象。 4. 基本表結構的修改 5. 查詢(去除重覆值) 7. 字元串匹配(LIKE) 8. 三值邏輯(AND OR NOT) 9. 輸出排序 10. 輸出列重命名 ...
  • 根據阿裡月報 : MySQL · 引擎特性 · InnoDB 事務鎖系統簡介 MySQL · 引擎特性 · Innodb 鎖子系統淺析 行鎖的入口:rec_lock_rec ...
  • 1,利用Beta測試來邀請測試者。 2,利用新聞發佈。 3,創建Web應用的宣傳網站。 4,使用郵件營銷。 5,創建YouTube視頻教程。 6,提交到蘋果Web應用門戶。 7,提交到其它Web應用門戶網站。 8,利用社交網路的傳播力。 參考資料:《iOS Web應用開發》 ...
  • 需求: 手機app ,當打游戲或者全屏看視頻的時候會發現這時候手機頂部的狀態欄是不顯示的,當我們從手機頂端向下進行滑動或手機底端向上滑動的時候,狀態欄會顯示出來,如果短暫的幾秒時間沒有操作的話,狀態欄會再次隱藏。 實現代碼: 效果: 代碼解釋: 1、 onWindowFocusChanged(boo ...
  • 項目地址https://github.com/979451341/OpenSLAudio OpenSL ES 是基於NDK也就是c語言的底層開發音頻的公開API,通過使用它能夠做到標準化, 高性能,低響應時間的音頻功能實現方法。這次是使用OpenSL ES來做一個音樂播放器,它能夠播放m4a、mp3 ...
  • 基本信息 例子 和協議配合使用的比較多 方法介紹 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...