如何解决在保存之前通过不同的控制器存储用户的临时数据
在会话期间存储临时数据的最佳实践?我有一个应用程序,它允许我在医疗服务中注册客户,插入生物识别和个人数据(姓名、体重、个人测量蚀刻。)一旦数据被保存,你就会转到其他页面,在那里你可以使用数据。只有在这条路径的最后(3-4 个控制器之后),我才通过 Realm 将 Customer 保存在本地数据库中。
在注册阶段,我需要存储这个“Tempuser”的数据,可以从多个控制器访问。
我想我可以使用单身人士,但不确定是否和如何
我的想法:
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
但正如我之前提到的,我所描述的只是一种方法。这将真正取决于您的个人案例和业务逻辑。由于我想保持简短的回答,因此我鼓励您更多地发现该主题,关于该主题的文章很多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。