2013-03-24 3 views
1

EDIT: Хорошо, я решил сохранить массив в userDefaults ... должно быть легко, не так ли? Сохранить:Encode NSMutableArray

NSUserDefaults *userDefs = [NSUserDefaults standardUserDefaults]; 
    [userDefs setObject:videoArray forKey:@"dataArray"]; 
    [userDefs synchronize]; 

Нагрузка:

NSUserDefaults *userDefs = [NSUserDefaults standardUserDefaults]; 
    videoArray = [[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"dataArray"]; 

    [tableview reloadData]; 
    NSLog(@"%@",videoArray); 

Класс объектов, которые находятся в массиве:

@interface DEVideoModel : NSObject 

@property (copy) NSString *name; 
@property (copy) NSImage *thumbnail; 
@property (copy) NSDictionary *qualities; 
@property (readwrite) float videoSize; 
@property (readwrite) float progress; 
@property (copy) NSString *filePath; 
@property (copy) NSDate *datum; 


@end 

@synthesize name,filePath,videoSize,qualities,thumbnail,datum,progress; 
-(id)init { 
    self = [super init]; 
    if(self) { 
     qualities = [[NSDictionary alloc]init]; 
     thumbnail = [[NSImage alloc]init]; 
    } 
    return self; 
} 


@end 

И мой videoArray есть (нуль), когда я загрузить его?! Я не понимаю. videoArray - это NSMutableArray, а не NSArray.

+0

является метод encodeWithcoder вызывался? –

+0

ah я вижу, encodeWithCoder не получает вызов. Я что-то пропустил ? В моем .h я реализован dehlen

+0

Примечание: Вы создали 'NSApplicationSupportDirectory'? Этот каталог не существует по умолчанию в изолированной программной среде приложения. Кроме того, не используйте строковые форматы для создания путей. Используйте 'NSString * path = [appSupportDir stringByAppendingPathComponent: @" DEConvert.dat "];' – rmaddy

ответ

2

В вашем коде вы указываете NSData для NSCoder, поэтому вам нужно прочитать NSData, а затем преобразовать его в Array.

NSURL *appSupportDir = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error]; 
NSString *path = [NSString stringWithFormat:@"%@/DEConvert.dat",[appSupportDir path]]; 
NSLog(@"%@",appSupportDir); 
NSData *data = [NSData dataWithContentsOfFile:path]; 
NSMutableArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

для хранения объекта в NSUserDefault

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"your key"]; 

разархивирование так же просто:

NSData *NewData = [[NSUserDefaults standardUserDefaults] objectForKey:@"your key"]; 
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:NewData]; 
+0

Я получаю этот вывод: *** - [NSKeyedUnarchiver initForReadingWithData:]: данные NULL – dehlen

+0

Я отредактировал ответ, я забыл добавить имя файла в путь, который мы читаем. попробуйте сейчас, извините за неудобства. удачи –

+0

Да, я видел это и исправил его сам. Теперь результат просто прекрасен (нет больше ошибок), но сохранение определенно ложно. Я посмотрел на сохраненный файл .dat: /// !!! СПИСОК БИНАРНОЙ СОБСТВЕННОСТИ ПРЕДУПРЕЖДЕНИЕ !!! // // Создан список довольно печатных свойств ниже // из двоичной версии на диске и не должен быть сохранен как // формат ASCII является подмножеством двоичного представления! // {\t "$ archiver" = "NSKeyedArchiver"; \t "$ objects" = ("$ null"); \t "$ top" = {root =: false; }; \t "$ version" = 100000; } ' – dehlen