ios UIKit + SwiftUI项目中的业务逻辑放在哪里?[已关闭]

ohtdti5x  于 2023-01-22  发布在  iOS
关注(0)|答案(1)|浏览(108)
    • 已关闭**。此问题为opinion-based。当前不接受答案。
    • 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

5天前关闭。
Improve this question
我正在尝试在现有项目中使用SwiftUI。我可以在UIHostingController的帮助下使用SwiftUI,但我有点困惑,我应该把SwiftUI接口触发的业务逻辑放在哪里。它应该由相关的UIViewController处理,还是应该由相关的ViewModel处理?

// controller
import UIKit
import SwiftUI

class Page3ViewController: UIViewController {
    @IBOutlet weak var theContainer: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let childView = UIHostingController(rootView: Page3SwiftuiView())
        addChild(childView)
        childView.view.frame = theContainer.bounds
        theContainer.addSubview(childView.view)
    }
}

//SwiftUI code

    import SwiftUI
    
    struct Page3SwiftuiView: View {
        var body: some View {
            VStack {
                Button {
                // how to handle the code
                } label: {
                Text("Save")
                .padding()
                .foregroundColor(.white)
              .background(.blue)
           }
    
        }
      }
    }

假设我想在保存按钮上执行一个API,我应该通过创建一个ViewModel来处理这个问题,还是应该通过ViewController来处理这个问题?

vatpfxk5

vatpfxk51#

在“我的理想世界”中(意思是这个回答是基于我认为最正确的,我相信还有其他更正确的方法,我也可能是潜在的不正确的),事情应该是这样的:
您应该为swiftUI视图创建一个单独的view-modelclass/struct,但它不应进行API调用。此类的示例(我们称之为vmInstance,供以后参考),应通过视图控制器传递给swiftUI视图,在示例化时(在viewDidLoad()方法中)。视图控制器应该拥有另一个class/struct的示例(我们称之为控制器),它执行所有业务逻辑,在本例中是API调用,但也可以是其他东西,并将结果返回给视图控制器,视图控制器将使用从API接收到的数据更新vmInstance(可以使用示例方法)。这应该在内部更新一些@Published属性,这将触发swiftUI视图更新。
这听起来可能太复杂了,但它应该有助于更易维护和扩展的代码库。您可能会对此多加思考,看看如何构建视图模型控制器,以便将来如果您要将swiftUI视图与视图控制器分离,视图模型如何直接利用控制器触发API调用。
正如我前面提到的,这是在“我的理想世界”中。对于任何正在阅读的人,请随时发表评论,让我知道我在这里建议的方法是否有什么错误,或者你闻到了反模式的味道等等。如果我错了,我很乐意学习和理解。

相关问题