如何在iOS中获取会话变量。例如,我有五个视图控制器从登录页面开始。以用户身份登录时,我可以从我的JSON数据中获取用户标识。我希望在所有屏幕中都使用此用户标识,以更平滑的方式完成。我所做的是将一个隐藏变量发送给下一个屏幕,当我们有100个屏幕时,这是一件困难的事情。有没有其他的方法来设置会话变量并访问遍及应用程序的那些变量?iOS中的会话变量
我试过的是在Appdelegate中保留NSString,但我无法理解如何做到这一点。
如何在iOS中获取会话变量。例如,我有五个视图控制器从登录页面开始。以用户身份登录时,我可以从我的JSON数据中获取用户标识。我希望在所有屏幕中都使用此用户标识,以更平滑的方式完成。我所做的是将一个隐藏变量发送给下一个屏幕,当我们有100个屏幕时,这是一件困难的事情。有没有其他的方法来设置会话变量并访问遍及应用程序的那些变量?iOS中的会话变量
我试过的是在Appdelegate中保留NSString,但我无法理解如何做到这一点。
在NSUserDefaults的保存价值,也从
获取它节省:
[[NSUserDefaults standardUserDefaults] setObject:STRING_OBJECT_OF_YOUR_JSON_LOGIN_ID forKey:@"UserLoginIdSession"];
[[NSUserDefaults standardUserDefaults] synchronize];
为retrive:
NSString *str = [[NSUserDefaults standardUserDefaults] valueForKey:@"UserLoginIdSession"];
,当用户从您的应用程序集注销这到@“”
[[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"UserLoginIdSession"];
[[NSUserDefaults standardUserDefaults] synchronize];
您有很多选择。
保存到NSUserDefaults
[[NSUserDefaults standardUserDefaults]setObject:@"12345" forKey:@"SessionKey"]; // Save session id [[NSUserDefaults standardUserDefaults]objectForKey:@"SessionKey"];//Access in other view controllers
保持它的appDelegate作为一个属性,你可以在所有的视图控制器访问AppDelegate
singleton class
要共享多个视图控制器的数据。Anil谢谢你的回应,请你引导我一步一步或证明一个例子,以便我可以继续前进。 –
如果你想在AppDelegate中保存这些信息,你只需要在AppDelegate.h中声明的那个类(AppDelegate)中创建属性。您可以从应用程序的其他部分访问的appDelegate及其属性:
sessionData = [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] sessionProperty];
我用它来定义一个宏,以避免冗长。在AppDelegate.h:
#define myAppDelegate ((MyAppDelegate*)[[UIApplication sharedApplication] delegate])
所以我可以从任何地方访问它的方法在应用程序:
sessionData = myAppDelegate.sessionProperty ;
然而,保持会话数据的应用程序委托并不总是一个很好的做法。我更喜欢使用单例来保持会话信息。例如:
sessionData = [[SessionManager sharedManager] sessionProperty] ;
要创建一个单例,您只需创建一个新类并重新定义alloc和copy。显然,定义方法sharedManager。
首先:显然你是用userID参数化每个视图控制器。这样做并没有什么错,它保持了信息的良好封装。是的,这可以是额外的工作。是的,以一种好的方式封装数据是额外的工作。
但是,如果你想改变它,它是拥有应用程序委托属性的一种方法。请记住:这将创建使用userID的每个类的相关性到应用程序委托。这降低了代码重用的能力。因此,有一个额外的类Session
是一个好主意。在登录过程中创建一个并将其存储在应用程序委托中。
整个过程:
A.创建一个类Session
@interface Session : NSObject
@property (readonly, copy) NSString *userID;
@end
@interface Session()
@property (readwrite,copy) NSString *userID;
@end
@implementation Session
- (id)initWithUserID:(NSString*)userID
{
self = [super init];
if (self)
{
self.userID = userID;
}
return self;
}
@end
B.创建实例并将其存储在应用程序委托
…
// login
NSString *userID = …;
self.session = [[Session alloc] initWithUserID:userID];
…
C.使用的用户ID
要使用你必须导入你的标题应用程序委托类和会话类:
//
#import "AppDelegate.h" // To get the session instance
#import "Session.h" // To get the user ID
…
Session *currentSession = [UIApplication sharedApplication].delegate.session;
NSString* userID = currentSession.userID;
…
可以摆脱依赖于AppDelegate中的,如果实现的Session
共享实例。这样做的代码是有点更直截了当:
//
#import "Session.h" // To get the user ID
…
Session *currentSession = [Session currentSession];
NSString* userID = currentSession.userID;
…
如何创建这样一个共享实例(称为单,即使它不是)上所以在很多,很多答案解释。
你不需要一个花哨的类/单例/ NSUserdefaults来做到这一点:继承人为什么。
NSUserDefaults
不是会话,它们在应用程序启动之间持续存在。所有你真正需要的是一个静态类,其中有一个NSMutableDictionary
。
// Session.h
@interface Session : NSObject
+ (NSMutableDictionary *) sessionVariables;
@end
// Session.m
#import "Session.h"
static NSMutableDictionary *_session;
@interface Session
+ (NSMutableDictionary *) sessionVariables {
if (!_session) {
_session = [NSMutableDictionary alloc] init];
}
return _session;
}
所以在每一个类,你要提供会议所有你需要做的是进口Session.h
和使用类这样
和得到的东西出来id someValue =
[会议sessionVariables] [@“东西” ];`
我推荐的一件事是请不要将用户/密码/敏感数据存储在任何提供的答案(包括我的)中,请使用iOS Keychain。
“SessionOrRAMUserDefaults”,我认为该类更好的名称;) – gaussblurinc
@gaussblurinc好吧,是的它是:P –
最好是让+ (NSMutableDictionary *)sessionVariables'线程安全。 – Ans
DharaParekh我需要放置这个NSUserDefaults和NSString的位置? –
保存从我的JSON数据中获取用户ID并在其他5个控件中检索它 – DharaParekh