2014-03-07 38 views
0

如何在iOS中获取会话变量。例如,我有五个视图控制器从登录页面开始。以用户身份登录时,我可以从我的JSON数据中获取用户标识。我希望在所有屏幕中都使用此用户标识,以更平滑的方式完成。我所做的是将一个隐藏变量发送给下一个屏幕,当我们有100个屏幕时,这是一件困难的事情。有没有其他的方法来设置会话变量并访问遍及应用程序的那些变量?iOS中的会话变量

我试过的是在Appdelegate中保留NSString,但我无法理解如何做到这一点。

回答

5

在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]; 
+0

DharaParekh我需要放置这个NSUserDefaults和NSString的位置? –

+0

保存从我的JSON数据中获取用户ID并在其他5个控件中检索它 – DharaParekh

1

您有很多选择。

  1. 保存到NSUserDefaults

     
    [[NSUserDefaults standardUserDefaults]setObject:@"12345" forKey:@"SessionKey"]; // Save session id 
    
    [[NSUserDefaults standardUserDefaults]objectForKey:@"SessionKey"];//Access in other view controllers 
    
  2. 保持它的appDelegate作为一个属性,你可以在所有的视图控制器访问AppDelegate

  3. 创建一个共享singleton class要共享多个视图控制器的数据。
+0

Anil谢谢你的回应,请你引导我一步一步或证明一个例子,以便我可以继续前进。 –

0

如果你想在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。

0

首先:显然你是用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; 
… 

如何创建这样一个共享实例(称为单,即使它不是)上所以在很多,很多答案解释。

5

你不需要一个花哨的类/单例/ 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

+0

“SessionOrRAMUserDefaults”,我认为该类更好的名称;) – gaussblurinc

+0

@gaussblurinc好吧,是的它是:P –

+0

最好是让+ (NSMutableDictionary *)sessionVariables'线程安全。 – Ans