2013-08-18 1 views
2

У меня возникли проблемы с поиском проблемы с записью массива объектов NSDictionary в файл.NSArray writeFileToPath сбой

Каждый ключ в объектах NSDictionary: NSString s, как и значения. Таким образом, массив должен быть доступен для записи в plist, поскольку необходимо указать состояния документации. Во всяком случае, вот мой код:

BOOL success = [representations writeToFile:[self filePathForCacheWithCacheID:cacheID] atomically:YES]; 
//success is NO 

метод Filepath выглядит следующим образом:

+ (NSString *)filePathForCacheWithCacheID:(NSString *)cacheID 
{ 
    NSURL *cachesDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject]; 
    return [[cachesDirectory URLByAppendingPathComponent:cacheID] absoluteString]; 
} 

и CacheId является строкой "объекты". Во время выполнения, метод filePathForCacheWithCacheID: возвращает строку типа:

file:///Users/MyName/Library/Application%20Support/iPhone%20Simulator/7.0/Applic‌​ations/3A57A7B3-A522-4DCC-819B-DC8DEEDCD041/Library/Caches/objects 

Что может идти здесь не так?

+0

Каков путь к файлу, который вы пишете? Я имею в виду, какое значение во время выполнения возвращается методом 'filePathForCacheWithCacheID:'? –

+0

Похоже на sim: file: ///Users/MyName/Library/Application%20Support/iPhone%20Simulator/7.0/Applications/3A57A7B3-A522-4DCC-819B-DC8DEEDCD041/Library/Caches/objects –

ответ

4

Код пытается записать файл в строку, представляющую URL-адрес файла, а не путь к файловой системе. Если вы хотите использовать возвращаемое значение этого метода, где, как ожидается, строки пути, вы должны заменить absoluteString вызов с path:

+ (NSString *)filePathForCacheWithCacheID:(NSString *)cacheID 
{ 
    NSURL *cachesDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject]; 
    return [[cachesDirectory URLByAppendingPathComponent:cacheID] path]; 
} 

В качестве альтернативы, есть метод filePathForCacheWithCacheID: вернуть NSURL, а затем использовать метод writeToURL:atomically:.

+ (NSURL *)fileURLForCacheWithCacheID:(NSString *)cacheID 
{ 
    NSURL *cachesDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject]; 
    return [cachesDirectory URLByAppendingPathComponent:cacheID]; 
} 
... 
BOOL success = [representations writeToURL:[self fileURLForCacheWithCacheID:cacheID] atomically:YES];