身份验证后跨视图控制器保留用户数据

Posted

技术标签:

【中文标题】身份验证后跨视图控制器保留用户数据【英文标题】:Persisting user data across view controllers post-authentication 【发布时间】:2014-11-27 16:37:52 【问题描述】:

我正在开发一个(我的第一个)ios 应用程序,它利用了我编写的 Web 服务/数据 API。用户在登录/通过身份验证后可以使用此 API 创建帐户并检索信息。所有用户都说:用户名、用户 ID、个人资料图片、传记等……我创建了一个 NSObject“用户”,它是一个具有相应属性/属性的类。登录后,在每个视图控制器中,我们需要访问此用户数据,而我现在实施的解决方案是为每个视图控制器提供一个属性“用户”,该属性需要我的用户对象。每次实例化视图控制器时,我都将用户类实例分配给视图控制器的用户属性,以便我可以从视图控制器中访问该实例化用户类的属性。我知道这不是一个最佳解决方案,但由于我一直在努力学习 iOS,所以这就是我现在所使用的。

我的问题是:在我的应用程序的多个视图控制器中持久保存这些用户数据以供使用的最佳方式是什么?

其他说明: 我需要持久化的数据量相对较少,类型为 NSString、NSNumber 和 UIImage。我的用户类正在为当前登录的用户实例化,也为其他用户实例化,例如,在检索“朋友”的数据然后查看他们的个人资料时。只有在用户已通过身份验证的情况下才能访问用户的数据,因此我需要能够在会话过期后销毁数据存储。

【问题讨论】:

您是否正在寻找一种在本地存储用户名、用户 ID、个人资料图片、传记...的方法? 【参考方案1】:

给你。

我不确定您实际上要存储多少数据,但是...有一个 iOS 包装器可以在本地存储少量数据,名为 NSUserDefaults。 它真的很容易使用。 Check out the documentation

它使用 KVC 来设置/获取数据。

这是一个简单的例子:

保存数据

 [[NSUserDefaults standardUserDefaults] setString:myString forKey:@"username"];
[[NSUserDefaults standardUserDefaults] synchronize];

得到它

_userName = [[NSUserDefaults standardUserDefaults]
                   stringForKey:@"username"];

【讨论】:

【参考方案2】:

如果您需要用户在全球范围内可用,您可以将其作为公共属性存储在您的应用委托中。比如:

在您的 AppDelegate.h 中

@interface AppDelegate UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) NSObject *user; // or User *user; if you have an actual user class

然后在您的视图控制器中

#import "AppDelegate.h" // at the top
[UIApplication sharedApplication].delegate.user; // where you need access to the user

您可以采用的另一条路线是将您的用户保存在属性中的单例类。例如:

@interface UserManager : NSObject
-(instancetype) sharedHandler;
@property (strong, nonatomic) NSObject *user;
@end

@implementation UserManager
+(instancetype) sharedHandler

    static instancetype sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        sharedInstance = [[self alloc] init];
    );
    return sharedInstance;

@end

很多人认为单例和全局属性是不好的做法,但我认为它们有其用途;他们只是被滥用并获得了坏名声。我应该补充的另一件事是,这不会在应用程序启动之间保留信息(如果应用程序被用户退出或被系统终止);与@NewEngland 的答案不同。好在如果你想要的话,你实际上可以同时使用这两个想法。

【讨论】:

谢谢肖恩。我接受了另一个答案,因为他首先做出了回应,并且该解决方案对我很有效。不过,我非常感谢您的洞察力。谢谢!

以上是关于身份验证后跨视图控制器保留用户数据的主要内容,如果未能解决你的问题,请参考以下文章

android to django - 如何对用户进行身份验证

我有登录页面如何使用 coredata 数据库对用户进行身份验证?

Flutter Firebase 不保留用户身份验证

Symfony 5.3 新身份验证不保留我的身份验证

在 Blazor 中的视图之外访问经过身份验证的用户

游戏中心身份验证视图未显示 - iOS