Swift 輕量級網路層設計

2022-05-09 00:48:11 字數 2447 閱讀 4377

普遍我們的網路層設計的時候直接是如下結構apimanager.post(url, parameter,completehandle),伺服器配置在apimanager.m檔案中進行配置。這樣乙個簡單便捷網路請求類便寫好了,但細心思考我們會發現如下一些問題:

相同api可能分散各處導致每次需要填寫的引數key值。**處理**也可能會存在冗餘。

//例如登入功能  apimanager.post("登入apiurl",,completehandle)

//登入功能首先必然存在於loginvc中

loginvc ==> 登入功能

//此時要求實現自動登入功能,那麼在主控制器生成時應該判斷是否可以自動登入(當然也可以推出loginvc後再去自動登入)

mainvc ==> 自動登入(登入功能)

此時便需要在兩處來寫入url、parameter及**方法,當此介面有更新時就需要在兩處進行修改,若工程中用到的此網路功能越多則需要修改的地方也越多!

部分網路請求需要隨著頁面的pop而取消,手動進行管理task顯得笨拙而麻煩。

關於網路請求起飛後**沒有著陸點是很危險的一件事,因此正常的做法是讓apimanager.post返回task任務,並有當前請求發起類持有,並在當前請求類析構並且task任務未完成時取消。這樣的操作方式一看就繁瑣,若乙個大工程處處這樣維護怕是相當麻煩了!

因此我們便需要設計出乙個能解決上述問題的網路層設計

此種設計主要是請求類持有自定義request,並向中介軟體bqapimanager傳入request呼叫urlsession。此過程中request會持有task任務,當請求類被釋放時,request也會釋放,此時判斷其是否有任務執行如有任務執行則停止執行。從而達到自動取消任務的功能。而此時針對相同的url及其引數便可封裝與乙個request中,可有效的減少冗餘**!

bqrequest.swift

主要在於封裝引數key值和設定url並處理網路請求類容及持有並按需取消或釋放task任務

//關鍵**如下

var result: any?//如成功處理網路請求內容後result有值

weak var task: urlsessiontask?

public func url() -> string //api介面

//模型轉字典

public func todiction() -> [string: any]

dict[p.label!] = (p.value as anyobject)

}return dict

}//請求內容處理

public func responseaction(data: data?, response: urlresponse?, error: error?) catch let err as nserror

}if let error = error

}//保證析構時(請求類不存在時)取消正在執行的任務

deinit

self.task = nil}}

bqapimanager.swift

主要作用為配置伺服器環境(方便本地、測試服、正式服的切換),並通過傳入的request發起網路請求。

其中主要的關鍵點在與避免request與task的迴圈持有。

//關鍵**如下

public class func sendrequest(request: bqrequest, completionhandler:@escaping () -> ()) }}

request.task = task

}

其中bqnetwork中的內容是基於urlsession的乙個簡單封裝,這裡便不再詳述

以上述登入功能為示例,此時需設計loginrequest繼承與bqrequest並重寫其url 及 responseaction方法

public name: string?

public pwd: string?

override public func url() -> string

override public func responseaction(data: data?, response: urlresponse?, error: error?)

}

接著讓loginvc持有loginrequest對name及pwd賦值(減少因引數key欄位出錯而失敗的情況),並通過bqapimanager發起請求即可。

這種設計方式主要是通過對moya的模仿變化而來,其做到了最簡單、方便的管理。當然在實際運用中可能也會出現問題,如發現問題或有何不妥之處望指正!謝謝!最後附上筆者自己的swift工具庫

輕量級網路 Xception

xception是google繼inception後提出的對inception v3的另一種改進,主要是採用depthwise separable convolution來替換原來inception v3中的卷積操作。xception在參數量上同inception v3基本等同,在imagenet上...

關於許可權設計的輕量級實現

關於許可權設計的輕量級實現 在各種各樣的系統中,許可權設計是必不可少的,現在基本基於角色的思想,即乙個使用者屬於某個角色當然也可能屬於多個角色,然後根據角色來確實相應的許可權,以進一步驗證其合法性,最後才執行操作.很多人可能在使用者進入系統的某模組之前就進行許可權驗證,後來知道,微軟的sps並不是這...

輕量級網路基礎知識記錄

基礎知識記錄 計算消耗 1 全連線層 2 啟用函式 3 卷積層 4 batch normalization 5 其他層 記憶體占用 1 權重的記憶體占用 2 feature maps 和中間結果 flops 注意全大寫,是floating point operations per second的縮寫...