美文网首页
夸页面夸业务线数据传递的思考

夸页面夸业务线数据传递的思考

作者: 874b526fa570 | 来源:发表于2021-05-14 17:42 被阅读0次

github: https://github.com/wangjinshan/GlobelMatchingData

问题: 很多时候开发中会遇到一个这样的问题, 有几个页面是经过多个界面跳转,然后根据最开始的入口处业务参数的不同,显示不同的内容的场景

举个例子


流程图.png

如何实现上面的数据传递呢? 一层一层传递?我觉得不科学,用协议去传递?感觉代码入侵成也很高, 所以我想了以下两个方法, 目前我在项目里已经实现, 给位老板有什么见解 qq: 1096452045 咱们聊聊你的更好的方案

实践方案一:

你在不确定你赋值的对象是不是还在内存中,需要选择单利去处理, 但是这种场景需要你自己控制你赋值数据的有效性,最后在不用了的时候及时更新成 nil

场景: root-->presentA-->pushB-->pushC-->pushD-->popRoot
协议: 你可以继承这个协议去做你觉得合理的业务配置
GlobelMatchingDataProtocol
入口处
  @objc func push1() {
        let controller = AViewController()
        GlobelMatchingModelManager.share.matchingModel = GlobelMatchingDataDefault(actionType: .pop, name: "Line 1", callback: {
            print("line 1 执行完毕")
        })
        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
        }
    }
    
    逻辑跳转
     @objc func push1() {
        if let navi = navigationController {
            navi.popToRootViewController(animated: true)
        } else {
            dismiss(animated: true, completion: nil)
        }
        matchingModel?.callback?()
        GlobelMatchingModelManager.share.matchingModel = nil
    }

实践方案二:

你在你的业务场景中非常明确,你赋值的对象一定在内存中,通常都是push行为,控制器都保存在堆栈中,这时候思路就是从后往前找出所有赋值过的对象,默认以找到最后一个赋值对象为准其他赋值无效, 在这种场景下你不需要关心内存问题,对象在控制器销毁时候被销毁

场景: root-->pushB-->pushC-->pushD-->popRoot
入口:
  let controller = BViewController()
        controller.matchingModel = GlobelMatchingDataDefault(actionType: .push, name: "Line 2", callback: {
            print("line 2 执行完毕")
        })
        navigationController?.pushViewController(controller, animated: true)

出口:

 override func viewDidLoad() {
        super.viewDidLoad()
        matchingData().startWithResult { [weak self] result in
            self?.setupData(result: result)
        }
}

跳转逻辑
 @objc func push2() {
        let controller = BViewController()
        matchingModel?.callback?()
        navigationController?.pushViewController(controller, animated: true)
    }

相关文章

  • 夸页面夸业务线数据传递的思考

    github: https://github.com/wangjinshan/GlobelMatchingData...

  • 朋友等级

    超一线亲戚:夸!无限的夸奖你!各种夸!! 一线好友:夸你好看! 二线朋友:客观分析... 三线老乡:告诉你如何更好...

  • 夸一夸我们的数据专员

    我们的数据专员,是入职不足半年的新同事,早就想夸一夸她的。 年底需要的数据频次多、急、大,也超出日常所需的数据范畴...

  • 婆婆智慧——夸、夸、夸

    兰经常夸婆婆、夸老公。这不,又开始了。 我们和兰闲聊天,同事马对她说:“你穿这衣服挺好看的。” 兰喜笑颜开地说:“...

  • 夸一夸

    “老师,明天我过生日。”放学时,我班一个调皮的孩子跑到我跟前说了一声。“哦,那预祝你明天生日快乐。”男孩腼...

  • 夸一夸

    改革开放好,处处换新貌;弹指一挥间,四十年过去。金山是我家,美名人人夸;文明称号保,各项事业抓。大门设督岗,安全有...

  • 夸一夸

    本册书学完了,我们开始了全面复习。 现在重新再来书写生字,比第一轮的效果要好很多,字在田字格中的占位,一页纸上书写...

  • 夸一夸

    今天,有个小朋友说:好孩子是夸出来的。 嗯嗯,我赞同这个观点。 却要给他加个限定。 没有背后刻苦付出,只凭借小聪明...

  • 表扬孩子,我错了吗?

    本文要点,夸孩子时: 夸“具体”不夸“整体” 夸“事实”不夸“人格” 夸“行为”不夸“天分” 每次小区散步,...

  • 夸一夸,夸出美好

    一次偶然的机会,在杂志上读到一篇介绍高校夸夸群的文章。不少高校学生自主建立的学校夸夸群风靡网络,学生们在群里通过互...

网友评论

      本文标题:夸页面夸业务线数据传递的思考

      本文链接:https://www.haomeiwen.com/subject/knoqjltx.html