2014-02-08 93 views
0

我不知道我是否正确地做这件事。我正在研究一个用户必须登录的大型应用程序,并与各种功能和数据进行交互。有许多视图控制器需要访问此用户对象。在Objective-C中共享数据对象的最佳方式是什么?

以下片段是用户登录的时刻,现在我有一个用户对象可以在我的应用程序中使用。就在这种情况下,我使用虚拟数据。

User *user = [User new]; 
[user setupTempOfflineData]; 

self.newViewController.user = user; 

[self containerAddChildViewController:self.newViewController]; 

在newViewController是属性:

@property (nonatomic, strong) User *user; 

现在NewViewController可能有许多儿童和那些孩子们查看自己的控制器。所有这些都给用户提供了强有力的参考。其他信息,例如用户创建的注册组或内容的列表仍然存在。有时我会通过用户对象访问下载的信息,或者只是存储和共享对阵列/数据本身的引用。

在我脑子里的东西告诉我,我应该使用单身人士或其他设计模式,我只是不熟悉。因此把我带到这里来问这个问题:

我正在做对吗?

编辑:Informative link on KVO

+1

这是一种方法。有几十个,没有一个“最佳”的方式。 (使用单身/静态,BTW,有时是必要的,但不应该是你的第一个想法。) –

回答

0

你在做什么应该工作。你有没有想过协议和委托?如果您希望NewViewController(或其他视图控制器)在用户对象发生更改(KVO/Notificaiton是另一种设计模式)时收到通知,您可能需要考虑此设计模式。

用户。^ h

@class User; 
@protocol userProtocol <NSObject> 
-(void) userObjectDidGetUpdated:(User*) u; 
@end 
@interface User:NSObject {} 
@property (nonatomic,weak) id <userProtocol> delegate; // use weak here to prevent reference cycle 
@end 

User.m - 当你想通知与会代表,以获得更新的用户对象调用notifyDelegatesUserObjectHasChanged现在

@implementation 
@synthesize delegate; 
-(void) notifyDelegatesUserObjectHasChanged { 
    [[self delegate] userObjectDidGetUpdated:self]; 
} 
@end 

,你可以注册视图控制器来获取更新的用户对象遵循...

NewViewController.h

#import "User.h" 
@interface NewViewController:UIViewController <userProtocol> {} 

NewViewCon troller.m

@implementation 
-(void) userObjectDidGetUpdated:(User*) u { 
    // this callback method will get called when the User object changes 
} 
@end 
+0

因此,用户只能使用一个代理。我必须使用符合userProtocol委托的对象数组。但在这一点上,这听起来很像KVO /通知的全部内容。 –

2

您可以使用用户级的单例模式。 例如

User.h文件

@interface User : NSObject 

+ (User*)currentUser; 

//... 
// Some properties 
//... 

//... 
// Some methods 
//... 

@end 

User.m文件

//... 
+ (User*)currentUser 
{ 
    static User *user = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     user = [[self alloc] init]; 
    }); 

    return user; 
} 
//... 

导入 “User.h” 的文件在你的.PCH文件。

现在,您可以通过调用
[User currentUser];

+0

假设你有一个显示用户所在组的列表的屏幕。你会通过currentUser访问用户信息对象并将其用于所有必需的UITableView委托和数据源方法。或者你会保留一个弱引用或副本只是像这样的数组:self.groupArray = [User currentUser] .groupArray? –

+0

我只需在需要时调用[User currentUser] .neededProperty :) – arturdev

1

我使用Singleton模式在我的应用程序访问用户对象,并使用延迟实例来加载该用户。

在newViewController.m

所以

/** 
    * lazy instantiation of User 
*/ 
- (User *) user { 
    if (!_user){ 
     _user = [User getUser]; 
    } 
    return _user; 
} 
在User.h

@interface User : NSObject 

/** 
* Singleton 
*/ 
+ (User *) getUser; 

@end 

最后,在你的User.m

#import "User.h" 

/* 
* Singleton 
*/ 
static User *singletonUser = nil; 

@implementation User 

/** 
* Designated initializer 
*/ 
- (id) init { 
    self = [super init]; 
    if (self != nil) { 
     // Load your user from storage/CoreData/etc. 
     [self setupTempOfflineData]; 
    } 
    return self; 
} 

/** 
* Singleton 
*/ 
+ (User *) getUser { 
    if (singletonUser == nil) { 
     singletonUser = [[self alloc] init]; 
    } 
    return singletonUser; 
} 
@end 

所以,现在你可以使用self.user在你的NewViewController中。

相关问题