iOS開發之Alamofire源碼深度解析

来源:http://www.cnblogs.com/ludashi/archive/2016/08/08/5588044.html
-Advertisement-
Play Games

今天博客中的Alamofire源碼的版本是以現在最新的3.4版本為例。上篇博客系統的對NSURLSession相關的東西進行了詳細的解析,詳情請看《詳解NSURLSession》,為了就是給本篇博客打下基礎。因為AlamoFire就是對NSURLSession及其相關的東西進行了進一步的封裝,讓網路 ...


今天博客中的Alamofire源碼的版本是以現在最新的3.4版本為例。上篇博客系統的對NSURLSession相關的東西進行了詳細的解析,詳情請看《詳解NSURLSession》,為了就是給本篇博客打下基礎。因為AlamoFire就是對NSURLSession及其相關的東西進行了進一步的封裝,讓網路請求使用起來更為簡單。本篇博客就詳細的來窺探一下AlamoFire源碼,主要來看一下AlamoFire是如何對NSURLSession進行封裝的,並且來看一下在封裝時使用了哪些Swift語言中的高級用法,也就是看一下Swift語言進一步的使用方法。

當然AlamoFire是AF的Swift版本了,其中雖然是使用Swift語言實現的,但是實現思路與AFNetWorking大同小異。如果你之前閱讀過AFNetWorking的源碼,那麼你對Alamofire的源碼應該並不陌生,好多地方的實現思路是一致的。今天博客中不是教你如何去使用AlamoFire,而是告訴你Alamofire是如何實現的。本篇博客中的乾貨還是比較足的,關於AlamoFire的官方文檔請移步Alamofire -- github鏈接

下方第一部分的類圖是在閱讀AlamoFire源碼時為了梳理每個結構間的關係畫的一個簡單的類圖,下方的類圖沒有涵蓋AlamoFire中所有的類,而是給出了核心部分的模塊以及各個模塊間的關係。接下來我們將對下方的模塊進行拆分,然後各個擊破。本篇博客的主題思路是先整體的看一下AlamoFire的組織架構,並解析每部分的關係。然後對每個模塊進行詳細的解析,在解析時我們會對一些Swift語言的知識點進行提取,然後將其進行剖析。

 

一.Alamofire核心模塊概述

我們先整體上來看一下AlamoFire這個框架關係,概述一些核心模塊。該部分我們先來看一下AlamoFire的文件組織結構,然後在給出這些文件組織結構中類的關係。所以在本部分類圖是少不了的。廢話少說,進入該部分的主題。

1.Alamofire的目錄結構解析

首先我們來看一下AlamoFire的目錄結構,從整體上來把控一下AlamoFire。下方截圖是AlamoFire框架的所有文件,文件不算多,Alamofire框架的源代碼並不算多,所有理清Alamofire的框架結構還是不難的。下方截圖中是AlamoFire中的所有文件,Core文件夾下是Alamofire的核心文件,Features主要是對核心文件的擴展。今天我們就以核心文件為主,Feature文件為輔來窺探一下AlamoFire框架的源碼。

下方是對Core文件夾下的各個文件的功能簡述:

  • Alamofire.swift ---- 該文件中主要是給用戶提供一些便利的調用方法,用戶可以直接調用該文件中的便利方法來使用Alamofire相關功能。
  • Manager.swift ---- Manager中定義了Session對象,Session相關的Delegate,以及Delegate執行的隊列等相關信息,在Manager中創建Request對象發起請求。Manager管理的就是各種請求,Manager對象是以單例的形式對外開放的。
  • Request.swift ---- 該文件如其名,就是負責創建Session的各種task的,並執行相關的SessionTask,並調用相關書籍解析的功能模塊對數據進行解析並通過回調返回給用戶。
  • ParameterEncoding.swift ---- 負責請求參數的各種編碼(URL、URLEncodedInURL、JSON、PropertyList等編碼),並將編碼後的數據與URLRequest結合後的結果進行返回。
  • Result.swift ---- 對解析後的數據封裝成Result對象。
  • Response.swift ---- 負責將伺服器相應的數據進行封裝生成Response對象,該對象中就包括上述的Result對象,用戶最終會通過閉包回調的形式獲取到該Response的對象。
  • Notifications.swift ---- 其中是一個Notification結構體,該結構體中定義了一些字元串,這些字元串就是所需通知的Key,當網路請求DidResume、DidSuspend、DidCancel、DidComplete都會發出通知。
  • Error.swift ---- 其中是一個Error的結構體,其中封裝的是各種錯誤狀態。

Features文件夾下各個文件的功能簡述:

  • Download.swift ----- 對Manager和Request類進行擴展,使其支持Down Task,其中封裝了NSURLSessionDownloadDelegate相關代理方法。
  • Upload.swift ---- 在該文件中也是對Manager和Request類進行的擴展,使其支持Upload Task,其中封裝了NSURLSessionDataDelegate中獲取上傳數據進度的代理方法,也就是taskDidSendBodyData代理方法。
  • MultipartFormData.swift ---- 該文件從名字就可以看出是為了組織多表單數據上傳的數據的,在Upload Task中就使用到了MultipartFormData
  • Stream.swift ---- 和Download和Upload文件相似,該文件中也是對ManagerRquest做延展,主要使其支持數據流的傳輸,其中主要封裝和實現了NSURLSessionStreamDelegate相關的代理方法。
  • ResponseSerialization.swift ---- 該文件中主要是對Request類進行數據解析的延展的。其中封裝了各種對響應數據的解析方式,其中包括Data、String、JSON、PropertyList等解析方式。
  • NetworkReachabilityManager.swift ---- 該文件主要是對SystemConfiguration.framework中的SCNetworkReachability相關的東西進行封裝的,主要用來管理和監聽網路狀態的變化
  • ServerTrustPolicy.swift ---- 這個文件主要是對NSURLSession做的延展,其中定義了各種網路請求的認證策略,主要證書認證相關東西。
  • Timeline.swift ---- 該文件是為了方便調試而生的,其中記錄了相關操作的時間點,並且對其進行記錄,便於在Debug時使用到。
  • Validation.swift ---- 主要是用來驗證請求是否成功,如果出錯了就做相應的處理。

上面是AlamoFire中所有文件的概述,上面這些算是對AlamoFire框架有大概的瞭解吧。結合上方的概述,來研讀AlamoFire源碼還是比較清晰的。下方就是AlamoFire 3.4中相關文件的木頭結構,如下所示:

  

 

2.核心類間的結構

上面簡單的介紹了Alamofire框架的目錄結構以及每個文件所負責的內容。接下來我們進入到各個文件的內部,來整體的看一下核心類之間的關係。下方是核心類的“類圖”,當然下方只是核心類的。接下來來概述一下下方的類圖,因為下圖太大,在此看起來不太清楚,如果你感興趣,你可以另存為,然後放大查看。

  • 下方黑框中的部分對應的就是Alamofire.swift中的內容。其中主要是一些URL轉換字元串的延展以及URLRequst轉換成MutableURLRequest的延展,還有一些用戶使用的便利方法。
  • 黃框中就是我們Manager.swift中的內容了,Manager類的對象是以單例的形式對外展現的,上述黑框中的便利方法,主要是獲取Manager類的單例,然後調用相應的方法。
  • 綠框中所對應的主要是Request.Swift和Features文件夾中的內容,主要是Request類及其延展,當然還有對ManagerNSURLSession的延展。
  • 紅框中的就是網路請求會話的各種任務的回調方法的封裝了,在這些回調方法中提供了預設實現,並對外留有回調塊,以便讓用戶來自己實現這些回調方法。

  

 

二、Alamofire.swift源碼解析

第一部分算是概覽了一下Alamofire框架中的各個組成部分,接下來該進入到上述的各個模塊中來進一步來窺探其實現和組織方式了。還是“順藤摸瓜”,先從用戶看的到的地方著手,然後層層深入,直到你看不見的地方。所以第二部分我們先來看一下Alamofire.swift中的內容,因為該文件是Alamofire框架的入口。

1.Alamofire.swft中的類圖結構

下方的類圖就是第一部分類圖中黑框的放大版,根據Alamofire.swift這個文件我們不難畫出下方這個類圖。有一點要說明的就是在類圖中省略了一些遍歷方法,只寫了一些主要的,不過核心的功能還是有的。下方的URLStringConvertibleURLRequestConvertible是負責類型轉換的介面,具體的請看下方的介紹。該文件中除了類型轉換的方法外就是一些調用Manager的單例的便利方法了。

  

2.Alamofire.swift技術細節

下方就是URLStringConvertible協議以及相關延展的具體實現,主要功能就是將String、NSURL、NSURLComponents、NSURLRequest中的URL轉換成字元串類型。將要轉換的類型要遵循URLStringConvertible協議,併在計算變數URLString中返迴轉換後的字元串。具體做法如下所示,這中類型轉換方式在開發中經常會使用到,下方會給出其他實例。URLRequestConvertible協議的功能與URLStringConvertible大同小異,URLRequestConvertible協議的實現者負責將NSURLRequest轉換成NSMutableURLRequest類型。在此就不做過多的贅述了。

  

下方截圖是Alamofire.swift中的一個便利方法,其他幾個便利方法與此相似,都是調用Manager單例中相應的方法,便利方法為了鏈式調用Request類中的相關方法,所以所有的便利方法都會返回當前Manager單例使用的Request對象。具體如下所示:

  

 

3.擴展用例

學以致用,舉一反三。上面那種“面向協議”開發的思想值得我們學習,之前在設計模式相關的系列博客中不止一次的提到過要“面向介面編程”,此處的協議就是介面。雖然上面只是使用協議來進行簡單的類型轉換,這種思想是非常值得我們學習的。通過上面類型轉換的方式,我們可以寫出下方代碼。下方代碼不是Alamofire框架中的代碼,是我根據上述的類型轉換的實例所實現的,下方定義了一個類型轉換的協議,需要轉換的類型要遵循這個協議,下方以String為例,具體做法如下所示。

  

 

三、Manager.swift源碼解析

因為便利方法主要是調用的Manager類的單例,所以接下來我們來看Manager.swift中的東西。Manager類中主要負責SessionRequest的初始化,並且提供SessionDelegate代理方法的預設實現。在實現代理方法時留出了相應的閉包已提供給用戶使用該閉包來回調相應的代理方法。在Manager中的SessionDelegate類就是NSURLSessionDelegate以及相關子協議的代理類 ,其中就給出了各個代理方法的預設實現,在實現時並定義了一系列的Closure回調變數,當這些閉包變數不為空時就會執行閉包塊中的內容,而不會執行提供的預設實現。

1.Manager.swift相關類圖

下方類圖就是黃色部分的放大版,主要是Manager類與SessionDelegate的關係。從下方類圖中不難看出,SessionDelegate類遵循了NSURLSessionDelegate協議以及子協議,並給出了代理相應的實現方法。下方的代碼會給出代理的具體封裝和實現方式。

  

 

2.Manager類的相關屬性

開門見山,因為Manager類對外是以單例的形式對外使用的,所以我們先來看看Manager類的單例實現。下方截圖中的sharedInstance計算屬性就是Manager的單例,其中存儲的就是一個Manager對象,在創建Manager對象時我們為Manager對象中存儲的NSURLSession對象指定了一個defaultSessionConfiguration和一個defaultHTTPHeaders。

  

上面是Manager類中單例的實現,接下來我們來解析類中核心的屬性,下方是一些核心屬性的解析:

  • defaultHTTPHeaders屬性 : defaultHTTPHeaders是Manager類中的一個計算屬性,負責組織預設的請求Header中的內容。
  • session屬性: 該屬性的類型是NSURLSession類型的,負責請求會話,並創建各種會話任務。
  • queue屬性:該屬性是一個串列隊列,該隊列負責執行session創建Session Task的任務。
  • delegate屬性:該屬性是SessionDelegate類型的,而SessionDelegate類遵循了NSURLSessionDelegate及其子協議,並給出了相應的實現,在下方會著重介紹SessionDelegate。而此處的delegate屬性負責調用SessionDelegate類中相應的回調方法。

 

3.Manager類的request方法

在Manager.swift源文件中給出了request方法的實現,Manager類的單例所調用的upload、download等方法是在其他源文件中做的延展。那些延展中的方法稍後在聊,本部分中就先對request方法進行解析。下方的方法就是我們在便利方法中使用Manager類的單例所調用的方法。method參數表示請求方式(GET, POST, PUT等),URLString參數是請求地址,parameter就是請求參數了。encoding參數就是請求參數的編碼方式,此處預設是URL編碼。headers字典參數就是請求頭信息了,預設為nil。下方代碼主要是創建NSMutableURLRequest對象,然後將參數進行相應的編碼後添加進NSMutableURLRequest對象中,然後調用request()方法發起請求。

  

下方代碼段是上述函數中所調用的request()方法,下方的request()方法負責通過Session創建dataTask,也就是負責執行Data Task任務。然後在初始化Request類的對象時,將創建的Data Task對象傳給Request對象。然後將Request對象的 Task Delegate對象存入Manager類的delegate屬性中。因為在delegate屬性中的代理方法是調用相應的Task Delegate的方法,所以在此有必要進行存儲。然後調用Request對象的resume()方法發起數據的網路請求。為了鏈式調用Request對象的其他方法,所以將Request類的對象進行返回。代碼如下所示:

  

 

4. Manager中SessionDelegate解析

SessionDelegate可以說是代理的代理,因為在SessionDelegate中有一個subdelegates字典屬性,該屬性負責存儲Request對象中的各個Task Delegate。而SessionDelegate在相應的代理方法中會通過存儲的Task Delegate來調用Task Delegate中的方法,所以SessionDelegate說是代理的代理。

下方代碼段是SessionDelegate類中部分代碼的截圖,其中的subdelegates字典屬性中存儲的就是Request中的TaskDelegate,subdelegateQueue是一個並行隊列用來同步執行獲取和設置字典中的Task Delegate對象。然後就是為SessionDelegate類定義了一個下標,該下標的功能是以Session Task為下標的形式向subdelegates中添加和獲取相應的Task Delegate。該自定義下標就可以讓類的對象使用下標的形式來設置和獲取屬性的值,稍後會給出擴展的Demo。

  

關於SessionDelegate中所實現的代理方法,在此我們就一執行Data Task請求的didReceiveData代理方法為例。下方截圖就是SessionDelegate中的didReceiveData代理方法。代碼比較簡單,首先判斷該代理方法對象的Closure回調變數是否有值,如果有就執行該閉包回調塊,如果沒有值就獲取我們存儲的Data Task Delegate, 然後去執行Data Task Delegate中的didReciveData方法。其他方法也於此類似,所以就以點代面,在此就不做過多的贅述了。

 

5.知識點擴展

接下來有到了舉一反三,擴展知識點的時刻了。接下來我們單獨來創建一個小實例來看一下Swift中自定義下標是怎麼回事。大道至簡,接下來我們將上述下標的使用進行簡化,創建一個Demo, 然後通過這個Demo來介紹一下下標的使用。

下方代碼段就是我們創建的簡化版的下標示例,在Swift的類中是支持自定義下標的,自定下標可以讓你以下標的形式來訪問和設置屬性。下方就自定義了一個下標,在下標中設置和返回value屬性的值。用法如下所示:

  

 

四、Request.swift源碼解析

逐漸深入,我們現在來到了Request.swift這個類,因為上面的Manager中的請求最終走到了Request類的位置,所以接下來我們要分析的就是Request.swift源文件中的內容。Request.swift源文件中主要是執行的Data Task請求,並且實現了相應的Data Task Delegate中的方法。其他的任務例如Download Task, Upload Task,Stream Task等會在其他文件中對Request做延展時執行上述這些任務。我們在此就以Data Task為例。Request類中說白了就是負責通過會話創建相應的Task,並實現相應Task的代理方法。

1. Request相關類圖

下方類圖就是Request相關類圖了,Request類及其延展中就是創建各種類型的Task,然後給出相應的Task Delegate。下方類圖還給出個各種Task Delegate間的繼承關係。Request相關源文件在給出TaskDelegate的代理方法的實現時,也封裝了閉包狀態下的回調方法。這中做法與SessionDelegate中做法一致。下方會給出具體的介紹。

  

 

2.Request類的初始化方法

下方就是Request類的初始化方法,方法需要兩個參數,第一個參數是NSURLSession的對象,該對象也就是Manager單例中創建的Session的對象。而第二個參數雖然是Manager傳過來的,但是初始化task的任務還得交給Request類來做,Manager來只不過是定義了一個NSURLSessionTask的類型傳到了Request中,例如在Manager的request()方法中task是NSURLSessionDataTask,Manager的upload()方法中的task是NSURLSessionUploadTask類型。

在Request的初始化方法中根據Manager單例提供的task的類型來確定是創建DataTaskDelegate、UploadTaskDelegate等。在相應的Task Delegate中會創建相應的Task。我們還以上述的DataTask為例,如果你調用Manager單例中的request()方法就會執行下方的DataTaskDelegate()的初始化。如下所示:

  

上面的delegate是TaskDelegate類型的,因為UploadTaskDelegate、DownloadTaskDelegate以及DataTaskDelegate都是TaskDelegate的子類,所以此處用到了面向對象的“多態性”。下方兩個屬性就是Request類中的delegate和task屬性,delegate的初始化在上述Requset的初始化方法中,而此處的task是一個存儲屬性,task的初始化是放在相應的TaskDelegate中的,在TaskDelegate中創建完task對象後再賦值給Request類中的task屬性,如下所示:

  

 

3. Requset類中的Progress閉包

在使用Request類的對象時,我們可以鏈式的調用Request中的方法,最常用的就是獲取相應任務執行的進度,也就是平時我使用的progress()方法。下方截圖中的代碼段就是progress()方法的實現。通過Task Delegate的類型來判斷目前執行的哪種任務,然後將傳過來的progress的閉包賦值給相應的Task Delegate,在這些Task的Delegate中會在相應的回調方法中獲取任務執行進度,然後執行下方傳入的Closure

  

 

4.Request的resume()方法

下方就是Request類中的resume()方法,其中的代碼比較簡單。主要是用來記錄startTime,然後調用task的resume方法開始執行任務。當然在開始執行任務後要發起相應的通知,此處發出的是DidResume通知。所有的通知類型都在Notifications.swift文件中的Notifications結構體中存儲著。Request類中的其他方法,比如suspend()、cancel()方法的實現方式與resume()類似,並且都會發出相應的通知,在此就不做過多的贅述了。

   

 

5.Request類中的相關代理類

從第一部分中的類圖中我們能看出與Request類相關的代理類,TaskDelegate是所有代理類的基類。在該代理類中其實就是定義了一下必要的屬性和NSURLSessionTaskDelegate中對應的回調方法,並且為這些回調方法提供相應的閉包回調的形式。此處就以TaskDelegate代理類為例。下方就是TaskDelegate代理類為NSURLSessionTaskDelegate中相應的代理方法提供的Closure方式。其他的代理類如DataTaskDelegate、DownloadTaskDelegate等與此類似。而相應的代理方法中就是對回調進行了處理,不過在處理之前會判斷相應的Closure是否為nil, 如果不為nil的話就執行Closure閉包塊中的內容。如果為nil,就執行提供的預設處理。

  

 

事無巨細,至此Alamofire中的核心類就已經介紹完畢,因為篇幅有限,其他類在此就不做過多贅述了。其他類以及其他文件中的內容在第一部分中做了概述,其內部的實現細節就不做過多贅述了,在Github上分享的代碼對這些類的關鍵技術細節給出了註釋。

在Alamofire框架中大量的使用了延展、閉包以及枚舉關聯值。特別是在解析網路請求的數據時,將閉包類型作為函數的參數,然後通過閉包變數來提供相應的解析方案,在此就不做過多的贅述了,其他技術細節“仁者見仁,智者見智”。聽我說再多,看再多的技術博客如果不親自的去瞭解一下,說再多也是沒用的,實踐出真知。關於Alamofire源碼的其他內容在此就不做過多贅述了,如果感興趣就親自的去閱讀吧,歡迎互相交流。今天博客就先到這兒。

github分享鏈接:https://github.com/lizelu/iOS_NetWorkingAndAlamofire


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

-Advertisement-
Play Games
更多相關文章
  • 先分析佈局 我把頁面分為5部分 第一行 一張圖片 第二行 一個p里包含了7個超鏈接 修飾: 第三行 一張圖片 第四行 終於把內容寫完了 修飾: 1 修飾國內新聞和國際新聞 2.修飾小標題 3.修飾p標簽 4.修飾hr 5.修飾國際新聞下麵的文字 我選擇用結構偽類選擇器 選擇p這個類型的第3個p 6. ...
  • 我是一個初識html基礎的菜鳥,讓我感受博客園的大愛吧! 下麵這個問題是建立在我對html現階段理解的程度上遇到的一個 元素溢出問題,希望能得到老鳥的指點。 問題如下: 希望有對該問題的多種不同解決方案,和網頁佈局建議(希望有乾貨)。 問題2:新手上路,很多企業級前端問題充斥大腦,全是問號,經驗是在 ...
  • 先分析做題思路 一、佈局 1.因為剛剛學到表格佈局,所以首先把頁面劃分為幾個部分 2.經過觀察,發現這個表格可以分為6行,先把table和tr弄好 3、把每一行的元素寫上 (1)第一行 可以分為兩列 第一列:一張圖片 第二列:一行超鏈接(我用p包含),自動換行後,一個輸入框,一個普通按鈕 (2)第二 ...
  • 文本陰影text-shadow屬性特效: 1.右下角陰影,左下角陰影,左上角陰影,右上角陰影 文字效果為: 如果將text-shadow改成:text-shadow:-10px 10px #333 ,就將出現左下角陰影 將text-shadow改成:text-shadow:-10px -10px # ...
  • Node.js v6.3.1 Documentation https://nodejs.org/dist/latest-v6.x/docs/api/​ npm官網 https://www.npmjs.com/​ 菜鳥教程nodejs http://www.runoob.com/nodejs/node ...
  • meta標簽作用 META標簽是HTML標記HEAD區的一個關鍵標簽,提供文檔字元集、使用語言、作者等基本信息,以及對關鍵詞和網頁等級的設定等,最大的作用是能夠做搜索引擎優化(SEO)。 PS:便於搜索引擎機器人查找、分類,互聯網應用應該要註意。 大網站都是怎麼寫? 在瞭解這個標簽之前,我查找了各個 ...
  • 1、效果圖 2、佈局文件 3、代碼實現(方式一) 4、代碼實現(方式二) ...
  • OS X 10.11 安裝Cocoapods 出現問題的解決方法 今天嘗試用 Cocoapods安裝個第三方庫.. 輸入pod install, 發現 command not find。 WTF! 估計是升級10.11後Cocoapods被幹掉了。 我輸入 sudo gem install coco ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...