NSKeyedUnarchiver - удалить декодированные данные? - PullRequest
16 голосов
/ 23 июля 2010

Я не смог получить никаких ответов на мой предыдущий (связанный) вопрос, поэтому мне интересно, поможет ли это немного перефразировать.

Я кодирую несколько сложных объектов с помощью NSKeyedArchiver исохранить его на диск.Скажем, что-то вроде -

Class member {
    int *id;
    NSString *name;
    NSMutableArray *array;
    TempClass *object;
}

Функциональность, которую я пытаюсь создать, заключается в том, чтобы пользователь мог сохранить свою работу, скажем, при создании нового участника и вернуться к нему позже.Когда пользователь заканчивает работу, он нажимает на сообщение, и данные передаются в веб-сервис.Если нет, он просто нажимает кнопку сохранения и покидает экран, и данные сохраняются, чтобы приложение могло возобновить работу с того момента, когда пользователь вернется.Теперь, когда я разместил данные в веб-сервисе, я больше не хочу хранить данные на диске и не могу найти способ их удалить.

Теперь моя кодировка иклассы декодирования функционируют нормально.Я могу использовать NSKeyedArchiver, чтобы сохранить данные на диск и извлечь их с помощью NSKeyedUnarchiver.Но мой вопрос: как я могу удалить данные, которые мне больше не нужны?Нужно ли вручную удалять файл на диске?Есть ли способ заставить NSKeyedUnarchiver удалить данные, которые он возвращает?

Спасибо,Тея.

Ответы [ 5 ]

21 голосов
/ 25 июля 2010

Очень простой способ просто удалить его программно после публикации данных:

- (BOOL) deleteFile:(NSString *) pathOfFileToDelete error:(NSError *)err {
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: pathOfFileToDelete];
    if(exists) { 
        [[NSFileManager defaultManager]removeItemAtPath: pathOfFileToDelete error:err];
    }
    return exists;
}
5 голосов
/ 13 июля 2017

Пример Swift3:

do {
 try FileManager.default.removeItem(atPath: path)
} catch {
 // catch potential error
}
5 голосов
/ 04 марта 2016

Для Swift 2.0:

func deleteFile(path: String) -> Bool{
    let exists = NSFileManager.defaultManager().fileExistsAtPath(path)
    if exists {
        do {
            try NSFileManager.defaultManager().removeItemAtPath(path)
        }catch let error as NSError {
            print("error: \(error.localizedDescription)")
            return false
        }
    }
    return exists
}
2 голосов
/ 05 октября 2018

Для Swift 3.0 -> 4.1:

let fileManager = FileManager()
let fileName = "your_file_name"

//In Order to get your file path correctly
getFileURL(_ fileName: String) -> String? {
    let fileURL = fileManager.urls(for: fileManager.SearchPathDirectory.documentDirectory, in: fileManager.SearchPathDomainMask.userDomainMask).first
    return (fileURL?.appendingPathComponent(fileName).path)
}


//Persist Data
func persistData(_ data : Data) -> Bool{
     return NSKeyedArchiver.archiveRootObject(data, toFile: getFileURL(fileName)!)
}

//Get Persisted Data
func getArchivedData() -> Data?{
    return NSKeyedUnarchiver.unarchiveObject(withFile: getFileURL(fileName)!) as? Data
}

//Delete Persisted Data 
func deleteArchivedUser() -> Bool{
    do {
        try fileManager.removeItem(atPath: getFileURL(fileName)!)
        return true
    } catch _ {
        return false
    }
}
2 голосов
/ 18 декабря 2015

Для Swift 2.0:

do {
  try NSFileManager.defaultManager().removeItemAtPath("Your_PATH")
} catch {

}
...