Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 身份验证后跨视图控制器持久化用户数据_Ios_Objective C_Iphone - Fatal编程技术网

Ios 身份验证后跨视图控制器持久化用户数据

Ios 身份验证后跨视图控制器持久化用户数据,ios,objective-c,iphone,Ios,Objective C,Iphone,我正在开发我的第一个iOS应用程序,它利用了我编写的web服务/数据API。用户可以在登录/经过身份验证后使用此API创建帐户和检索信息。所有用户都说:用户名,用户id,个人资料图片,传记等。。。我创建了一个NSObject用户,它是一个具有相应属性/属性的类。登录后,在每个viewcontroller中,我们都需要访问此用户数据,而我现在实现的解决方案是为每个viewcontroller提供一个属性用户,该属性用户需要我的用户对象。每次实例化视图控制器时,我都将用户类实例分配给viewcont

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

我的问题是:在我的应用程序中,保存这些用户数据以便跨多个视图控制器使用的最佳方法是什么

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

给你

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

它使用KVC设置/获取数据

下面是一个简单的例子:

保存数据

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

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

如果您需要用户在全球范围内可用,可以将其作为公共属性存储在应用程序代理上。比如:

在AppDelegate.h中

@interface AppDelegate UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) NSObject *user; // or User *user; if you have an actual user class
另一种方法是使用一个将用户保存在属性中的singleton类。例如:

@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的答案不同,后者会。好的是,如果你想要的话,你可以同时使用这两种想法。

你是否在寻找一种存储用户名、用户id、个人资料图片、传记的方法。。。本地?谢谢肖恩。我接受了另一个答案,因为他先回答了,这个解决方案对我很有效。不过,我非常感谢你的洞察力。谢谢
@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