объекты, соответствующие nscoding, не будут записаны в файл - PullRequest
3 голосов
/ 18 марта 2011

Я хочу записать массив объектов Question в файл, но каким-то образом writeToFile ничего не делает. Вопрос имеет владельца и массив объектов ответа. Ответ также имеет владельца. Все три из них соответствуют протоколу NSCoding (насколько я знаю).

Из приведенного ниже кода результат возвращает НЕТ. Понятия не имею, что я делаю неправильно, так как я внедряю NSCoding для всего, верно?

Question.h

#import <Foundation/Foundation.h>
#import "Owner.h"

@interface Question : NSObject <NSCoding> {
    NSString *questionId;
    NSString *questionRevision;
    NSString *text;
    NSDate *date;
    NSMutableArray *answers;
    NSString *page;
    NSNumber *questionLocation;

    Owner *owner;
}

@property (nonatomic, retain) NSString *questionId;
@property (nonatomic, retain) NSString *questionRevision;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSMutableArray *answers;
@property (nonatomic, retain) NSString *page;
@property (nonatomic, retain) NSNumber *questionLocation;
@property (nonatomic, retain) Owner *owner;

@end

Question.m

#import "Question.h"
#import "Answer.h"

@implementation Question

@synthesize questionId, questionRevision, text, date, answers, page, questionLocation, owner;

- (void)encodeWithCoder:(NSCoder *)coder
{
    //[super encodeWithCoder:coder];
    [coder encodeObject:questionId forKey:@"questionId"];
    [coder encodeObject:questionRevision forKey:@"questionRevision"];
    [coder encodeObject:text forKey:@"text"];
    [coder encodeObject:date forKey:@"date"];
    [coder encodeObject:answers forKey:@"answers"];
    [coder encodeObject:page forKey:@"page"];
    [coder encodeObject:questionLocation forKey:@"questionLocation"];
    [coder encodeObject:owner forKey:@"owner"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    //self = [super initWithCoder:decoder];
    self = [super init];
    self.questionId = [decoder decodeObjectForKey:@"questionId"];
    self.questionRevision = [decoder decodeObjectForKey:@"questionRevision"];
    self.text = [decoder decodeObjectForKey:@"text"];
    self.date = [decoder decodeObjectForKey:@"date"];
    self.answers = [decoder decodeObjectForKey:@"answers"];
    self.page = [decoder decodeObjectForKey:@"page"];
    self.questionLocation = [decoder decodeObjectForKey:@"questionLocation"];
    self.owner = [decoder decodeObjectForKey:@"owner"];
}

@end

Answer.h

#import <Foundation/Foundation.h>
#import "Owner.h"

@interface Answer : NSObject <NSCoding> {
    Owner *owner;
    NSString *text;
    NSDate *date;
}

@property (nonatomic, retain) Owner *owner;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;

@end

Answer.m

#import "Answer.h"


@implementation Answer

@synthesize owner, text, date;

    - (void)encodeWithCoder:(NSCoder *)coder
    {
    //[super encodeWithCoder:coder];
    [coder encodeObject:owner forKey:@"owner"];
    [coder encodeObject:text forKey:@"text"];
    [coder encodeObject:date forKey:@"date"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    //self = [super initWithCoder:decoder];
    self = [super init];
    self.owner = [decoder decodeObjectForKey:@"owner"];
    self.text = [decoder decodeObjectForKey:@"text"];
    self.date = [decoder decodeObjectForKey:@"date"];
}

@end

Owner.h

#import <Foundation/Foundation.h>


@interface Owner : NSObject <NSCoding> {
    NSString *name;
    NSString *photoFileName;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *photoFileName;

@end

Owner.m

#import "Owner.h"


@implementation Owner

@synthesize name, photoFileName;

- (void)encodeWithCoder:(NSCoder *)coder
{
    //[super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@"name"];
    [coder encodeObject:photoFileName forKey:@"photoFileName"];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    //self = [super initWithCoder:decoder];
    self = [super init];
    self.name = [decoder decodeObjectForKey:@"name"];
    self.photoFileName = [decoder decodeObjectForKey:@"photoFileName"];
}

@end

Соответствующая строка кода
BOOL result = [questions writeToFile:@"Users/brunoscheele/Desktop/questions.plist" atomically:YES];

Ответы [ 2 ]

10 голосов
/ 18 марта 2011

writeToFile:atomically: записывает файлы списка свойств, а не сериализованные архивы.Типы списка свойств не могут быть расширены путем реализации NSCoding, и поскольку ваши объекты не относятся к числу типов, поддерживаемых списками свойств, их нельзя записать в список свойств.ваши объекты, вам нужно будет использовать NSAchiver, например:

[NSKeyedArchiver archiveRootObject:questions 
                 toFile:@"some/path/questions.archive"]
0 голосов
/ 18 марта 2011

Взято отсюда NSMutableArray writeToFile: атомарно всегда возвращает NO на устройстве, но отлично работает на симуляторе

Я не думаю, что вы не можете писать в пакет приложения, поэтому вы не можете писатьк списку в каталоге ресурсов.Один хороший способ - скопировать plist из каталога Resource в каталог Documents при первом запуске и получить к нему доступ в будущем.

...