Skip to content

Instantly share code, notes, and snippets.

@tomdiggle
Created December 8, 2014 14:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomdiggle/75906f60a485affaabd2 to your computer and use it in GitHub Desktop.
Save tomdiggle/75906f60a485affaabd2 to your computer and use it in GitHub Desktop.
Data persistence with NSCoding in swift for more information visit http://tomdiggle.com/blog/2014/12/08/data-persistence-with-nscoding-in-swift/
import Foundation
// Data persistence errors
public let DataPersistenceErrorDomain = "com.tomdiggle.datapersistence.error"
class DataPersistence {
// MARK: Saving Data
/**
* Save data to disk using NSKeyedArchiver.
*
* :param: AnyObject
* :param: NSSearchPathDirectory
* :param: String
* :return: A tuple containing the error that occurred, if any and a success and a boolen value to indicate success or failure.
*/
class func saveData(data: AnyObject, directory: NSSearchPathDirectory, filename: String) -> (error: NSError?, success: Bool) {
let dataFilepath = DataPersistence.dataFilepath(directory, filename: filename)
if dataFilepath.success {
if let filepath = dataFilepath.filepath {
return (nil, NSKeyedArchiver.archiveRootObject(data, toFile: filepath))
}
}
return (dataFilepath.error, false)
}
// MARK: Loading Data
/**
* Load data from disk using NSKeyedUnarchiver.
*
* :param: NSSearchPathDirectory The directory the data is located.
* :param: String The filename of the data.
* :return: A tuple containing the data that has been loaded, the error that occurred, if any and a boolen value to indicate success or failure.
*/
class func loadDataFromDirectory(directory: NSSearchPathDirectory, filename: String) -> (data: AnyObject?, error: NSError?, success: Bool) {
let dataFilepath = DataPersistence.dataFilepath(directory, filename: filename)
if let filepath = dataFilepath.filepath {
let data: AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithFile(filepath)
return (data, nil, true)
}
return (nil, dataFilepath.error, false)
}
// MARK: Helper Methods
private class func directoryURL(directory: NSSearchPathDirectory) -> (url: NSURL?, error: NSError?, success: Bool) {
var error: NSError?
if let fileDirectory = NSFileManager.defaultManager().URLForDirectory(directory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: false, error: &error) {
return (fileDirectory, nil, true)
}
return (nil, error, false)
}
private class func dataFilepath(directory: NSSearchPathDirectory, filename: String) -> (filepath: String?, error: NSError?, success: Bool) {
let directoryURL = DataPersistence.directoryURL(directory)
let filepath = directoryURL.url!.relativePath! + filename
if NSFileManager.defaultManager().fileExistsAtPath(filepath) {
return (filepath, nil, true)
}
let error = NSError(domain: DataPersistenceErrorDomain, code: -1, userInfo: nil)
return (nil, error, false)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment