2015-06-20 3 views
0

Я делаю приложение, которое имеет один класс MainUser, который должен быть доступен во всем приложении. Например, класс MainUser имеет переменную fullName, которая содержит строку с полным именем пользователя. Я хочу иметь доступ к этой переменной на любой другой сцене приложения, чтобы, возможно, сказать такие вещи, как «Добро пожаловать fullNameКак реализовать класс в Swift для создания глобального пользователя для приложения?

Как я должен это делать? Прямо сейчас, я делаю объект класса MainUser на экране запуска приложения, и я планирую передать этот объект на каждый следующий экран. Мне кажется, что это не очень эффективно, поэтому мне интересно, есть ли какой-нибудь глобальный метод для этого (хотя я искал это и обнаружил, что глобальные переменные довольно неустойчивы и непопулярны). В приложении будет только один пользователь , так что будет только один объект, когда-либо созданный для всей части приложения.

Любые идеи?

У меня есть большой опыт работы с объектно-ориентированным программированием на Java, но, как вы, вероятно, можете сказать из вопроса, я стал ржавым, потому что я довольно неактивен больше года.

+0

Возможный дубликат [Как вы делитесь данными между диспетчерами и другими объектами в Swift?] (Http://stackoverflow.com/questions/29734954/how-do-you-share-data-between-view-controllers -and-other-objects-in-swift) – nhgrif

ответ

-1

Звучит как идеальный случай для контейнера данных singleton. Посмотрите на эту тему, где я объясняю это в деталях, в том числе примера приложения, написанном в Swift:

How do you share data between view controllers and other objects in Swift?

одноплодным является объектом, где только один экземпляр когда-либо созданный, и имеет класс метод, который возвращает этот единственный экземпляр.

Контейнер данных singleton - это синглтон со свойствами для хранения общих данных. В примере, который я связал, содержится код, который сохраняет свойства по умолчанию для пользователей, когда приложение перемещается в фоновом режиме и загружает их, когда синглтон загружается первым.

+1

Это комментарий и что должно быть «близким, как дублирующее голосование», но не ответ. – nhgrif

+0

Этот подход все же позволил бы мне перейти в глобальный класс и изменить некоторые переменные, если они не являются константами, правильно? Например, если пользователь хотел поменять свое имя по любой причине, метод может быть вызван в глобальном классе, чтобы сделать именно это? – applemavs

+0

Как это не ответ? Он предлагает конкретное решение и дает ссылку на конкретный пример этого решения. Правда, что близким, как дубликат, был бы другой вариант. –

0

Не так хорошо в быстрой, поэтому отправляю код с объективом c. Я думаю, вы можете это перевести. Вот основной класс пользователя, который содержит свойства.

заголовочный файл здесь

#import <Foundation/Foundation.h> 

@interface User : NSObject 

@property (nonatomic, strong) NSString *UserID; 
@property (nonatomic, strong) NSString *Password; 
@property (nonatomic, strong) NSString *UserName; 
@property (nonatomic, strong) NSString *Email; 

- (instancetype)initWithData:(NSDictionary*)dicData; 

@end 

.m файл здесь

#import "User.h" 

@implementation User 

@synthesize UserID; 
@synthesize Password; 
@synthesize UserName; 
@synthesize Email; 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     UserID = @""; 
     Password = @""; 
     UserName = @""; 
     Email = @""; 
} 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    //Encode properties, other class variables, etc 

    [encoder encodeObject:self.UserID       forKey:@"UserID"]; 
    [encoder encodeObject:self.Password       forKey:@"Password"]; 
    [encoder encodeObject:self.UserName       forKey:@"UserName"]; 
    [encoder encodeObject:self.Email       forKey:@"Email"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 
     //decode properties, other class vars 

     self.UserID       = [decoder decodeObjectForKey:@"UserID"]; 
     self.Password       = [decoder decodeObjectForKey:@"Password"]; 
     self.UserName       = [decoder decodeObjectForKey:@"UserName"]; 
     self.Email       = [decoder decodeObjectForKey:@"Email"]; 
} 
    return self; 
} 

- (instancetype)initWithData:(NSDictionary*)dicData 
{ 
    self = [super init]; 
    if (self) { 
     UserID       = [dicData valueForKey:@"userid"]; 
     Password      = [dicData valueForKey:@"password"]; 
     UserName      = [dicData valueForKey:@"username"]; 
     Email       = [dicData valueForKey:@"email"]; 
} 
    return self; 
} 

- (void)dealloc 
{ 
    UserID= nil; 
    Password = nil; 
    UserName= nil; 
    Email= nil; 
} 

@end 

И ваш Singleton класс для хранения этого класса объект идет следующим образом.

заголовочных файл здесь

#import <Foundation/Foundation.h> 

#import "User.h" 


@interface AppDefaults : NSObject 

@property (nonatomic, strong) User *currentUser; 

+ (AppDefaults *)defaultInstance; 

@end 

и.м файл здесь

#import AppDefaults.h 

@implementation AppDefaults 

@synthesize currentUser; 

static AppDefaults *staticInstance; 

+ (AppDefaults *)defaultInstance{ 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     staticInstance=[[self alloc] init]; 
    }); 

    return staticInstance; 
} 

- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     currentUser = [[User alloc]init]; 
    } 
    return self; 
} 

@end 

Теперь вам нужно вызвать класс, как это каждый раз, когда

[AppDefaults defaultInstance].currentUser.Email = @"[email protected]"; 

и на первых порах, когда приложение открывает вам необходимо назначить пользователю класса дефолтов

[AppDefaults defaultInstance].currentUser = [[User alloc]init]; 

также, если у вас есть данные для пользователя, вы можете передать их и инициализировать пользовательский класс, а затем вы можете назначить объект пользователя классу по умолчанию. Это будет нести ценность во всем приложении. Единственное, что нужно - получить данные пользователя даже после того, как приложение будет убито. Вы должны сохранить пользователей декодированного объекта в NSUserDefaults, чтобы получить его в следующий раз, когда приложение запустится. Вот код идет

хранить

User *user = [[User alloc]initWithData:yourDataDictionary]; 
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:user]; 
[[NSUserDefaults standardUserDefaults] setObject:myEncodedObject forKey:@"loggedUser"]; 

и для получения и хранения

NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"loggedUser" ]; 
User *obj = (User *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject]; 
[AppDefaults defaultInstance].currentUser = obj; 

К сожалению я не смог перевести его в стрижа.

Смежные вопросы