筆者了解到最開始分享路由機制的文章是由蘑菇街團隊提供鏈結,其利用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...