首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保存之前,通过不同的控制器存储来自用户的临时数据

在保存之前,通过不同的控制器存储来自用户的临时数据
EN

Stack Overflow用户
提问于 2021-03-08 22:13:25
回答 1查看 82关注 0票数 0

在会话期间存储临时数据的最佳实践?我有一个应用程序,允许我在医疗服务中注册客户,插入生物识别和个人数据(姓名,体重,个人测量等)。保存数据后,您可以转到其他页面,在那里您可以使用数据执行一些操作。只有在此路径的最后(在3-4个控制器之后),我通过Realm将客户保存在本地数据库中。

在寄存器阶段,我需要存储这个“TempUser”的数据,可以从多个控制器访问。

我认为我可以使用单例,但不确定是否以及如何使用

我资助了this,但不确定哪种解决方案更适合。

我的想法是:

代码语言:javascript
复制
class AppSession {
    
    static var shared = AppSession()
    
    private init() {}
    
    var currentPatient: Patient?
    
}

class Patient {
    
    let shared = Patient()
    
    private init() {}
    
    var name: String? = ""
    var weight: Double = 0.0
}

在我的文本字段委托中:

代码语言:javascript
复制
AppSession.shared.currentPatient?.name = data //text from textfield

否则,将Patient用作结构,而不是类

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-08 23:49:35

很难说哪种解决方案适合每一种情况。这真的取决于数据在你的应用程序中的使用范围。它是每个部分都通用的,还是只有一些特定的ViewControllers?它被检索和更新了多少次?此外,它还取决于您正在使用的架构模式以及更多因素。因此,简而言之,使用单例模式的解决方案可能是有效的,但如果不深入查看您的项目,就不能确定。如果你决定坚持使用你的解决方案,你可以省略AppSession类,直接访问你的Patient​。

代码语言:javascript
复制
class Patient {
    static let shared = Patient()

    var name: String? = ""
    var weight: Double = 0.0
}

并更新它:

代码语言:javascript
复制
Patient.shared.name = ""

即使您使用单例模式的解决方案可能是有效的,如上所述,您也应该考虑用户的观点:您是否希望用户即使在应用程序被终止后仍能够继续流?如果是,那么你应该在每一步之后保存数据(所以可能会保存到KeyChain,因为你描述的是一种敏感数据)。或者更好的解决方案是将数据存储在服务器端,这使用户即使在其他设备(可能是android)上也可以灵活地继续。

但您可以说,您真的不关心KeyChain,也不关心与服务器通信,而是希望在本地进行通信。在这种情况下,我个人会在控制器之间传递数据,并避免使用单例。让我们以您的Patient对象为例,创建一个协议,该协议要求每个符合该对象的UIViewController都有一个存储属性Patient

代码语言:javascript
复制
struct Patient {
    var name: String? = ""
    var weight: Double = 0.0
}

protocol MyOnboardingProtocol: class {
    var data: Patient { get set }
}

使用MyOnboardingProtocol,您将标记需要保存Patient数据的每个控制器。通过这种方式,您将强制ViewControllers持有Patient对象,并在第一眼就知道您的ViewController是否属于“入职”流。

在流程开始的第一个UIViewController中,您将初始化Patient对象(可能还会根据用户输入对其进行一些更新),然后传递给下一个UIViewController

代码语言:javascript
复制
class MyFirstViewController: UIViewController, MyOnboardingProtocol {
    var data: Patient = Patient()

    func nextViewController() {
        let viewController = MySecondViewController(data: data)
        navigationController?.pushViewController(viewController, animated: true)
    }
}

对于以后的每个其他UIViewController,您将把更新后的对象传递到init中:

代码语言:javascript
复制
class MySecondViewController: UIViewController, MyOnboardingProtocol {
    var data: Patient

    init(data: Patient) {
        self.data = data
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

但正如我之前提到的,我所描述的只是一种方法。这将真正取决于您的个人案例和业务逻辑。由于我想保持我的答案简短,我鼓励你更多地探索这个主题,已经有很多关于这个主题的很好的文章。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66531392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档