Проблемы с NSKeyedArchiver - просто не архивирует вообще! - PullRequest
0 голосов
/ 23 сентября 2010

Я, вероятно, не вижу здесь чего-то, поэтому я прошу помощи :) Вот сделка, у меня есть массив элементов NSMutable, которые удовлетворяют протоколу NSCoding, но NSKeyedArchiver всегда не может его заархивировать ... вотмоя реализация объекта:

@implementation YTVideo
@synthesize URL,thumb,titulo;

#pragma mark NSCoding
#define kTituloKey          @"titulo"
#define kURLKey     @"URL"
#define kThumbKey       @"thumb"

-(id)initWithData:(NSString *)ktitle :(UIImage *)kThumb :(NSURL *)kURL{
self.titulo = ktitle;
self.thumb = kThumb;
self.URL = kURL;

return self;
}

- (void) encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:titulo forKey:kTituloKey];
[encoder encodeObject:URL forKey:kURLKey];
NSData *thumbData = UIImagePNGRepresentation(thumb);
[encoder encodeObject:thumbData forKey:kThumbKey];
}

- (id)initWithCoder:(NSCoder *)decoder {
NSString* ktitulo = [decoder decodeObjectForKey:kTituloKey];
NSURL* kURL = [decoder decodeObjectForKey:kURLKey];
NSData* kThumbdata = [decoder decodeObjectForKey:kThumbKey];
UIImage* kThumb=[UIImage imageWithData:kThumbdata];
return [self initWithData:ktitulo:kThumb:kURL];
}

@end

Во время выполнения программы у меня есть NSMutable массив этих объектов с именем videosArray.

, затем, в конце концов, я пытаюсь:

NSString* path =[NSHomeDirectory() stringByAppendingPathComponent:@"teste.wrapit"];
NSLog(@"PATH =%@",path);
bool teste = [NSKeyedArchiver archiveRootObject:videosArray toFile:path];
NSLog(@"aramzenamento:%@",teste ? @"sucesso!" :@"Nope");
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path];
NSLog(@"Arquivo armazenado existe?%@",fileExists ?@"Sim":@"Nao");

И я всегда терплю неудачу в своих булевых проверках ... Есть идеи, где я совершенно не прав ??Спасибо !!

1 Ответ

5 голосов
/ 23 сентября 2010

Проблема, с которой вы столкнулись, не имеет ничего общего с NSKeyedArchiver. Судя по всему, вы пытаетесь заархивировать ваш объект на корневом уровне вашей песочницы (каталог, возвращаемый NSHomeDirectory()). Попробуйте заменить первую строку второго блока кода на

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
path = [path stringByAppendingPathComponent:@"teste.wrapit"];

Другой (возможно, более чистый) способ получения пути к папке Documents заключается в использовании функции C NSSearchPathForDirectoriesInDomains, которая возвращает массив путей, соответствующих первому аргументу:

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"teste.wrapit"];

Стоит отметить, что в iOS функция NSSearchPathForDirectoriesInDomain гарантированно возвращает NSArray с одним элементом, когда вы используете встроенную константу (например, NSDocumentDirectory) для первого аргумента, поэтому вы можно смело использовать objectAtIndex:0 в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...