Swift 路由機制設計

2022-05-09 00:48:11 字數 2231 閱讀 1965

筆者了解到最開始分享路由機制的文章是由蘑菇街團隊提供鏈結,其利用url註冊來進行介面推出和傳值。隨後某位大神吐槽其機制有問題鏈結。在這裡筆者也開始思考過這個問題,並從他們的思路中得出了適合自己的路由機制設計。路由機制原理、優點等資訊網上有太多的資料可供參考,筆者不在這裡贅述。下面就為大家介紹筆者的路由機制設計方式

筆者覺得路由機制的設計主要涉及到兩點問題

推出介面

介面推出筆者選擇了最為簡單直接的一種方式,直接通過類名確定需要推出的控制器介面。再由當前控制器選擇進行何種方式的介面推出。在oc中可以直接通過類名轉化為class並生成控制器,但在swift中由於多了命名空間的原因需要由空間名+類名的方式來生成。具體**如下:

//這裡的bqroutercommprotocol是為資料傳輸準備的協議,會在資料傳輸部分進行說明

static func loadvc(vcname:string, spacename: string? = nil) -> t where t:bqroutercommprotocol else

let cls = nsclassfromstring(clsname) as? basevc.type

let vc = cls?.init()

if let valuevc = vc else

}

資料傳輸

當要推出的控制器檢視有了之後,便要考慮資料傳輸問題,首先是正向傳值,這種比較簡單直接略過,我們需要主要思考的是反向傳值方式,為了做到解耦,筆者最開始思考的方式是直接使用notificationcenter。考慮到其使用時效率問題(其本質原理是通過kvo方式去進行操作),因此筆者模擬通知中心設計了乙個路由通訊管理器。

通訊管理器設計思路

通訊管理器註冊進行通訊的控制器

通訊管理器傳輸資料到可接受的控制器

當控制器釋放時,從通訊管理器中反註冊

先設計通訊協議,目的是保證資料傳輸方式的統一和規範

protocol bqroutercommprotocol:nsobjectprotocol  //用於反註冊使用,初始數值小於0

func loadvcinfo(params:any) //用於正向傳值

func reciveroutercomm(name:notification.name, params:any?) //用於反向傳值

}

為了保證註冊後控制器不被通訊管理器強引用,中間使用**類進行橋接,以便控制器可以正常析構,在反註冊後就移除中間**類

class basevcproxy: nsobject 

}

最後進行通訊管理

這裡模仿通知中心的方式來進行通訊管理

//註冊(重複註冊無效)

class public func addroutercomm(names:notification.name..., target: bqroutercommprotocol)

//傳送資料

class public func postroutercomm(name:notification.name, params:any? = nil)

//反註冊

class public func romveroutercomm(target: bqroutercommprotocol)

通訊管理器關鍵**如下:

private func addcomm(names:[notification.name], target: bqroutercommprotocol) }}

let weakvc = basevcproxy(vc: target)

target.removeindex = self.commobjcs.index(of: weakvc)!

}private func postcomm(name:notification.name, params:any?) }}

}private func removecomm(target: bqroutercommprotocol)

}

到這裡大家應該都看出筆者路由設計的概貌了,如還是不太清楚,建議對照demo進行梳理

此路由機制的設計相對來說比較簡單,卻也是路由機制的主幹部分。如果想要豐富細化,仍有很多細節可處理。這個就看大家專案的實際需求了。在筆者看來路由機制其實可以作為一種架構設計來說,具體到控制其中又可以分為各種設計模式了。希望這篇文章能讓大家了解到swift路由設計的方式。如有任何錯誤之處歡迎指正!

SIP 路由機制

總的來說,sip中存在兩種路由場景 1,請求訊息的路由 2,響應訊息的路由 其中,響應訊息的路由非常簡單,就是完全依靠via來完成的,具體請見我關於rfc3261中會話流程的分析。下面我們只談sip請求訊息的路由。首先我們要搞清楚什麼是嚴格路由和鬆散路由。嚴格路由 strict routing 可以...

Django路由機制

django的url路由配置 settings.py檔案中的root urlconf變數指定全域性路由檔名稱 root urlconf 工程名稱.urls 預設對應工程目錄下urls.py檔案如 root urlconf mysite.urls django使用urlpatterns變數表示路由 u...

Vue路由機制 巢狀路由

doctype html html head meta charset utf 8 title vue路由機制 巢狀路由 title head body div id router link to user user router link router link to reg reg router...