2011-07-14 15 views
0

同じ種類のカスタムオブジェクトをキャッシュディレクトリに持つ辞書を作成します。私は何が間違っているのか分からないが、何も書かれていない。 writeToFileはfalseを返します。これは、単一のユーザーインスタンスを保存する必要があるときに機能していましたが、現在は辞書が必要です。辞書キーは文字列です。奇妙なことはinitWithCoderencodeWithCoderはまったく呼び出されません。キャッシュに辞書を書き込むことができません

私はこのような辞書保存この

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/"]; 
} 

などのキャッシュフォルダを取得する:私は-[User sharedUsers]であると仮定してい

@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 

答えて

1

+(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]; 
} 

UserオブジェクトをNSDictionaryのインスタンス。その後、アーカイブされたデータではなく、その場所にplistファイルを作成します。オブジェクトをアーカイブします

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

を、ディスクにアーカイブされたデータを書き込む:

あなたはこれを試してみてください。データをロード

は逆の操作です:

NSDictionary *users = [NSKeyedUnarchiver unarchiveObjectWithData:archivedUsers]; 
+0

ありがとうございました。私は実際に 'writeToFile'を使うことは' NSKeyedArchiver'で行うのと同じではないことを忘れています。 –

1

あなたはドキュメントディレクトリを使用して試すことができます。 ドキュメントディレクトリへのパスは、次にあなたが再びdocumentsDirectoryにstringByAppendingPathComponentを行うことができます

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

によってアクセスすることができます。

関連する問題