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



在会话期间存储临时数据的最佳实践?我有一个应用程序,可以让我在医疗服务中注册客户,插入生物特征和个人数据(姓名,体重,个人尺寸等),一旦数据保存,你就可以转到其他页面,在那里你可以使用这些数据进行一些操作。只有在这条路径的最后(在3-4个控制器之后),我通过Realm将Customer保存在本地数据库中。

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

我想我可以使用单例,但不确定IF和HOW

我投资了这个,但不确定哪个解决方案更合适。

我的想法:

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
}

和在我的textfield委托中:

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

否则,使用Patient作为结构体,而不是类

很难说哪种解决方案适合每种情况。这真的取决于数据在你的应用中使用的范围有多广。它是每个部分都通用的还是只是一些特定的视图控制器?它被检索和更新了多少次?此外,它还取决于您正在使用的体系结构模式和许多其他因素。所以简而言之,您使用单例模式的解决方案可能是有效的,但如果没有深入了解您的项目,则无法确定。如果您决定坚持使用您的解决方案,您可以省略AppSession类并直接访问Patient

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

并更新它:

Patient.shared.name = ""

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

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

struct Patient {
var name: String? = ""
var weight: Double = 0.0
}
protocol MyOnboardingProtocol: class {
var data: Patient { get set }
}

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

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

class MyFirstViewController: UIViewController, MyOnboardingProtocol {
var data: Patient = Patient()
func nextViewController() {
let viewController = MySecondViewController(data: data)
navigationController?.pushViewController(viewController, animated: true)
}
}

对于每一个其他的UIViewController,你将传递更新的对象到init:

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)
}
}

但正如我之前提到的,我所描述的只是一种方法。这实际上取决于您的个人情况和业务逻辑。因为我想让我的答案简短,我鼓励你多去发现这个话题,关于这个话题已经有很多很棒的文章了。

最新更新