2013-12-01 3 views
0

Я использую Restkit для возврата кучи объектов, когда пользователи нажимают на вход в систему. Мне нужно сохранить эти различные объекты и свойства в пользовательском NSObject для ссылки во всем приложении.Как сохранить данные в NSObject

Я не гений в Objc, поэтому мне нужен пример и объяснение того, что я делаю неправильно. У SO нет примеров для пользовательских NSObjects, поэтому я спрашиваю здесь.

Заранее спасибо, я обязательно приму правильный ответ.

В loginViewController у меня есть это, чтобы установить массив в пользовательском NSObject:

Crap *crapper = [[Crap alloc] init]; 
     [crapper setCrapArray:array]; 

этого Crap.h:

#import <Foundation/Foundation.h> 

@interface Crap : NSObject <NSCoding> 

@property (nonatomic, retain) NSArray *crapArray; 

- (void)encodeWithCoder:(NSCoder *)enCoder; 
- (id)initWithCoder:(NSCoder *)aDecoder; 

@end 

И Crap.m:

#import "Crap.h" 

@implementation Crap 

@synthesize crapArray; 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    //Encode properties, other class variables, etc 
    [encoder encodeObject:self.crapArray forKey:@"crapArray"]; 

} 

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

    } 
    return self; 
} 

@end 

Я использую это для извлечения данных в FeedViewController:

Crap *crap = [[Crap alloc] init]; 
NSLog(@"%d", crap.crapArray.count); 

Это, конечно, 0 (количество массивов действительно 40 штук).

ответ

2

Ваш заголовок файла Дерьмо должен быть

#import <Foundation/Foundation.h> 

@interface Crap : NSObject <NSCoding> 

@property (nonatomic, retain) NSArray *crapArray; 

+ (Crap *) crap; 

- (void)encodeWithCoder:(NSCoder *)enCoder; 
- (id)initWithCoder:(NSCoder *)aDecoder; 

@end 

Ваша реализация файл Дерьмо должен быть

#import "Crap.h" 

@implementation Crap 

@synthesize crapArray; 

+ (Crap *) crap { 
    static Crap *crap = nil; 
    if (!crap) { 
     crap = [[super allocWithZone:nil] init]; 
    } 

    return crap; 
} 

+ (id) allocWithZone:(struct _NSZone *)zone { 
    return [self crap]; 
} 

- (id) init { 
    self = [super init]; 
    if (self) { 
     // set default property values 
     crapArray = nil; 
    } 

    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)encoder { 
    //Encode properties, other class variables, etc 
    [encoder encodeObject:self.crapArray forKey:@"crapArray"]; 

} 

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

    } 
    return self; 
} 

@end 

Затем установить значение, которое вы должны сделать что-то вроде

[Crap crap].crapArray = [NSArray arrayWithObjects:@"Hello", @"Bye", nil]; 

И в получите это значение от другого контроллера точки зрения, вы должны сделать что-то вроде

NSLog(@"Value: %d", [[Crap crap] crapArray].count); 

Если вы

Crap *crap = [[Crap alloc] init]; 
NSLog(@"%d", crap.crapArray.count); 

crapArray будет установлен в ноль, и вы собираетесь получить 0 раз, потому что мы устанавливаем crapArray к нулю на методе инициализации.

+0

Отличный ответ, я думаю, он решит мою проблему. Возможно, вы могли бы сказать мне, что можно снова и снова обновлять массив дерьма внутри другого контроллера? Или он сохранит значение для всего жизненного цикла? – rihe

+1

Можно снова и снова обновлять массив дерьма внутри другого контроллера представления, просто попробуйте его и не забудьте импортировать файл Crap в контроллер вида, в котором вы хотите обновить массив –

0

startObject.h

#import <Foundation/Foundation.h> 

@interface startObject : NSObject 

@property (nonatomic, retain) NSArray *crapArray; 

@end 

startObject.m

импорт "startObject.h"

@implementation startObject 

@synthesize crapArray; 


- (id)init { 

    self = [super init]; 

    return self; 
} 
@end 

Использование:

startObject* start = [[startObject alloc] init]; 

start.crapArray = [NSArray arrayWithObjects:@"Alpha", @"Beta", @"Gamma", @"Omega", nil]; 

NSLog(@"%@",start.crapArray); 

Результат:

(
Alpha, 
Beta, 
Gamma, 
Omega 
) 

Приведенный выше код используется для сохранения данных в NSObject. Вот и все. Чтобы опубликовать его содержимое, вы просто устанавливаете start = nil.

Но если вы хотите сохранить данные на диск с помощью архивирования, дайте мне знать. Также посмотрите here для подробного руководства по использованию NSCoding.

+0

Я попросил пример кода, и все, что вы предоставили, - это код, который у меня уже был. Не могу этого принять. – CokePokes

+0

Прошу прощения. Будет отредактировать через минуту. – n00bProgrammer

+0

Только одно: вы хотите сохранить данные в NSObject (для использования в течение жизни), или вам нужен архиватор/кодировщик для сохранения данных на диск? – n00bProgrammer

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