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

问题描述

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

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

我想我可以使用单身人士,但不确定是否和如何

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

我的想法:

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
}

在我的文本字段委托中:

AppSession.shared.currentPatient?.name = data //text from textfield

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

解决方法

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

class Patient {
    static let shared = Patient()

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

并更新它:

Patient.shared.name = ""

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

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

struct Patient {
    var name: String? = ""
    var weight: Double = 0.0
}

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

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

在您的第一个 UIViewController 中,您的流程开始时,您将初始化您的 Patient 对象(也可能根据用户输入对其进行一些更新),并传递给下一个 {{1} }:

UIViewController

对于每个其他的 class MyFirstViewController: UIViewController,MyOnboardingProtocol { var data: Patient = Patient() func nextViewController() { let viewController = MySecondViewController(data: data) navigationController?.pushViewController(viewController,animated: true) } } ,您会将更新的对象传递到 init 中:

UIViewController

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...