github: https://github.com/wangjinshan/GlobelMatchingData
問題: 很多時候開發(fā)中會遇到一個這樣的問題, 有幾個頁面是經(jīng)過多個界面跳轉(zhuǎn),然后根據(jù)最開始的入口處業(yè)務(wù)參數(shù)的不同,顯示不同的內(nèi)容的場景
舉個例子
如何實現(xiàn)上面的數(shù)據(jù)傳遞呢? 一層一層傳遞?我覺得不科學(xué),用協(xié)議去傳遞?感覺代碼入侵成也很高, 所以我想了以下兩個方法, 目前我在項目里已經(jīng)實現(xiàn), 給位老板有什么見解 qq: 1096452045 咱們聊聊你的更好的方案
實踐方案一:
你在不確定你賦值的對象是不是還在內(nèi)存中,需要選擇單利去處理, 但是這種場景需要你自己控制你賦值數(shù)據(jù)的有效性,最后在不用了的時候及時更新成 nil
場景: root-->presentA-->pushB-->pushC-->pushD-->popRoot
協(xié)議: 你可以繼承這個協(xié)議去做你覺得合理的業(yè)務(wù)配置
GlobelMatchingDataProtocol
入口處
@objc func push1() {
let controller = AViewController()
GlobelMatchingModelManager.share.matchingModel = GlobelMatchingDataDefault(actionType: .pop, name: "Line 1", callback: {
print("line 1 執(zhí)行完畢")
})
controller.callback = { [weak self] in
let objc = BViewController()
self?.navigationController?.pushViewController(objc, animated: true)
}
present(controller, animated: true, completion: nil)
}
出口處:
override func viewDidLoad() {
super.viewDidLoad()
GlobelMatchingModelManager.share.matchingData().startWithResult { [weak self] result in
self?.setupData(result: result)
}
}
private func setupData(result: Result<GlobelMatchingDataProtocol?, Error>) {
switch result {
case let .success(value):
matchingModel = value
title = value?.name
case .failure:
matchingModel = nil
}
}
邏輯跳轉(zhuǎn)
@objc func push1() {
if let navi = navigationController {
navi.popToRootViewController(animated: true)
} else {
dismiss(animated: true, completion: nil)
}
matchingModel?.callback?()
GlobelMatchingModelManager.share.matchingModel = nil
}
實踐方案二:
你在你的業(yè)務(wù)場景中非常明確,你賦值的對象一定在內(nèi)存中,通常都是push行為,控制器都保存在堆棧中,這時候思路就是從后往前找出所有賦值過的對象,默認(rèn)以找到最后一個賦值對象為準(zhǔn)其他賦值無效, 在這種場景下你不需要關(guān)心內(nèi)存問題,對象在控制器銷毀時候被銷毀
場景: root-->pushB-->pushC-->pushD-->popRoot
入口:
let controller = BViewController()
controller.matchingModel = GlobelMatchingDataDefault(actionType: .push, name: "Line 2", callback: {
print("line 2 執(zhí)行完畢")
})
navigationController?.pushViewController(controller, animated: true)
出口:
override func viewDidLoad() {
super.viewDidLoad()
matchingData().startWithResult { [weak self] result in
self?.setupData(result: result)
}
}
跳轉(zhuǎn)邏輯
@objc func push2() {
let controller = BViewController()
matchingModel?.callback?()
navigationController?.pushViewController(controller, animated: true)
}