Невозможно записать словарь в кеш - PullRequest
0 голосов
/ 14 июля 2011

Я хочу написать словарь с пользовательскими объектами одного типа в каталог кэша.Я не знаю, что не так, но ничего не написано.writeToFile возвращает ложь.Это работало, когда мне нужно было сохранить только один экземпляр пользователя, но теперь мне нужен словарь.Ключи словаря являются строками.Странно то, что initWithCoder и encodeWithCoder вообще не вызываются.

Я получаю папку с кешем вот так

NSString * NSCacheDirectory()
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
  NSString *cacheDirectory = [paths objectAtIndex:0]; 
#ifdef DEBUG
  NSString *regi = [NSHomeDirectory() stringByAppendingPathComponent: @"/Library/Caches/"];
#endif
  return  cacheDirectory;
  //return [NSHomeDirectory() stringByAppendingPathComponent: @"/Library/Caches/"];
}

Я сохраняю словарь вот так:

+(void) saveSharedUsers {
  NSString *cacheDir = NSCacheDirectory();
  NSFileManager *fm = [[NSFileManager alloc] init];
  Boolean success = true;
  NSError *error = nil;

  if (![fm fileExistsAtPath: cacheDir ])
    success = [fm createDirectoryAtPath: cacheDir withIntermediateDirectories: true attributes: nil error: &error];
  success = [[User sharedUsers] writeToFile: [NSCacheDirectory() stringByAppendingPathComponent: USER_FILE] atomically: true];
  [fm release];
}

Объект пользователя:

@interface User : NSObject <NSCoding> {
  NSString    *email;
  NSInteger   userId;
  NSString    *name;
  NSString    *facebookId;
}

@property(nonatomic, copy)   NSString    *email;
@property(nonatomic, assign) NSInteger   userId;
@property(nonatomic, copy)   NSString    *name;
@property(nonatomic, copy)   NSString    *facebookId;
...
@end

@implementation User
...
@synthesize email,userId,name, facebookId;
- (void) encodeWithCoder:(NSCoder *)aCoder
{
  [aCoder encodeObject: self.name forKey:@"name"];
  [aCoder encodeObject: self.email forKey:@"email"];
  [aCoder encodeObject: self.facebookId forKey:@"facebookId"];
  [aCoder encodeInteger: self.userId forKey: @"userId"];
}

- (id) initWithCoder:(NSCoder *)aDecoder
{
  self = [super init];
  if (self != nil)
  {
    self.name = [aDecoder decodeObjectForKey: @"name"];
    self.email = [aDecoder decodeObjectForKey: @"email"];
    self.facebookId = [aDecoder decodeObjectForKey: @"facebookId"];
    self.userId = [aDecoder decodeIntegerForKey: @"userId"];
  }
  return self;
}
...
@end

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Вы можете попробовать использовать каталог документов. Путь к каталогу документов доступен по

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

Затем вы можете снова сделать stringByAppendingPathComponent для DocumentsDirectory.

1 голос
/ 14 июля 2011

Я предполагаю, что -[User sharedUsers] является экземпляром NSDictionary. Затем вы будете записывать файл plist в это место, а не в архивные данные.

Вы должны попробовать это:

NSData *archivedUsers = [NSKeyedArchiver archivedDataWithRootObject:[User sharedUsers]];
[archivedUsers writeToFile: [NSCacheDirectory() stringByAppendingPathComponent: USER_FILE] atomically: true];

Это позволит архивировать объекты и записывать архивные данные на диск.

Загрузка данных производится в обратном порядке:

NSDictionary *users = [NSKeyedUnarchiver unarchiveObjectWithData:archivedUsers];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...