2014-02-08 2 views
0

내가 제대로하고 있는지 모르겠다. 저는 사용자가 로그인하여 다양한 기능과 데이터와 상호 작용해야하는 대규모 애플리케이션을 개발 중입니다. 이 사용자 개체에 액세스해야하는 많은보기 컨트롤러가 있습니다.Objective-C에서 데이터 개체를 공유하는 최적의 방법은 무엇입니까?

다음 스 니펫은 사용자가 로그인 한 후 내 앱에서 사용할 사용자 개체가있는 순간입니다. 이 경우에는 더미 데이터를 사용하고 있습니다. newViewController에서

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

self.newViewController.user = user; 

[self containerAddChildViewController:self.newViewController]; 

는 속성입니다 :

@property (nonatomic, strong) User *user; 

이제 NewViewController 많은 아이를 가질 수 있으며, 그 아이들은 자신의 뷰 컨트롤러가 있습니다. 그들 모두는 사용자를 강력하게 언급했습니다. 사용자가 생성 한 등록 된 그룹 또는 컨텐츠의 목록과 같은 추가 정보도 남아 있습니다. 때로는 사용자 객체를 통해 다운로드 한 정보에 액세스하거나 배열/데이터 자체에 대한 참조를 저장하고 공유하기도합니다.

내 머리 속에서 뭔가 익숙하지 않은 싱글 톤이나 다른 디자인 패턴을 사용해야한다고 말하고 있습니다. 따라서 질문을하기 위해 여기로 데려 오는 것 :

나는이 권리가 있습니까?

편집 : Informative link on KVO

+1

그 방법 중 하나입니다. 수십 명이 있고, 아무도 "최적의"방법이 아닙니다. (싱글 톤/정적, BTW를 사용하는 것이 필요할 때가 있지만 때로는 필요하지 않습니다.) –

답변

0

당신이하고있는 일은 효과가 있습니다. 또한 프로토콜 및 위임에 대해 생각해 보셨습니까? User 객체가 변경되었을 때 NewViewController (또는 다른 View Controller)가 통보 받기를 원하는 경우 (KVO/Notificaiton이 또 다른 디자인 패턴 임)이 디자인 패턴을 고려할 수 있습니다.

사용자.시간

@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이 - 업데이트 된 사용자 개체를 얻을 수있는 대의원에게 통지 할 때

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

이제 notifyDelegatesUserObjectHasChanged 전화, 업데이트 된 사용자 개체 등을 얻을 수있는 뷰 컨트롤러를 등록 할 수 있습니다

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

당신은 사용자 클래스의 싱글 톤 패턴을 사용할 수 있습니다. 예 :

당신의 .PCH 파일에 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"파일을.

이제 당신은 내 응용 프로그램에서 싱글 톤 패턴을 사용하고
[User currentUser];

+0

사용자가있는 그룹 목록을 보여주는 화면이 있다고 가정 해 보겠습니다. 현재 사용자를 통해 사용자 정보에 액세스 하시겠습니까 개체를 만들고 필요한 모든 UITableView 대리자 및 데이터 소스 메서드에서 사용합니다. 아니면 약한 참조 또는 문제의 배열의 복사본을 유지할 것이라고 : self.groupArray = [User currentUser] .groupArray? –

+0

필자는 필요할 때 [User currentUser] .neededProperty를 호출한다. :) – arturdev

1

를 호출하여 사용자 개체에 액세스하고, 해당 사용자를로드하는 게으른 인스턴스를 사용할 수 있습니다. 당신의 newViewController.m에 따라서

@interface User : NSObject 

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

@end 

그리고 마지막으로

#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 

그래서 User.m 지금 당신이 self.user을 사용할 수 있습니다 User.h

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

귀하의 NewViewController.

관련 문제