Saving App Data in Property List Files


Saving App Data in Property List Files

Your app needs to save data. There's too much data to use User Defaults. Using SwiftData or Core Data would be overkill. One solution is to save the data in property list files. This article shows you how to save your app's data in property list files.

Use the PropertyListEncoder Class if you can

If the data you want to save conforms to the Codable protocol, use the PropertyListEncoder class to save the data. Encoding data with PropertyListEncoder requires you to do the following:

  • Create an instance of PropertyListEncoder.
  • Set the output format: XML or binary.
  • Call the encode function to encode the data to a Data object.

The following code encodes an object to an XML property list:

let encoder = PropertyListEncoder()
encoder.outputFormat = .xml
let data = try encoder.encode(object)

Use the PropertyListDecoder Class to Decode

Normally when your app encodes data, it also needs to decode the data. Use the PropertyListDecoder class to decode the data. Create an instance of PropertyListDecoder and call the decode function to decode the data.

The following code decodes an object from an XML property list:

let decoder = PropertyListDecoder()
object = try decoder.decode(YourClass.self, from: data, format: .xml)

Replace YourClass with the name of your struct or class.

Use NSKeyedArchiver if you can't use PropertyListEncoder

If the data you want to save doesn't conform to Codable, use the NSKeyedArchiver class to save the data to a property list. The easiest way to save data with NSKeyedArchiver is to call the class method archivedData. Supply the object you want to save and specify if you require secure coding. Usually you should require secure coding.

let data = try NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: true)

Encoding to XML

The default property list format is binary so using the archivedData function saves the data as a binary property list. If you want to save as an XML property list, you must do the following:

  • Create an instance of NSKeyedArchiver.
  • Set the instance's outputFormat property to XML.
  • Call the encode function to encode the data.
  • Call the finishEncoding function when you are done.

The encodedData property has the encoded data. The following function archives data to an XML property list:

func archive(format: PropertyListSerialization.PropertyListFormat = .xml) -> Data {
  let archiver = NSKeyedArchiver(requiringSecureCoding: true)
  archiver.outputFormat = format
  archiver.encode(object, forKey: "root")
  archiver.finishEncoding()
  return archiver.encodedData
}

Use NSKeyedUnarchiver to Unarchive

Use the NSKeyedUnarchiver class to unarchive the data you archived. If you use the archivedData function to archive, call the class function unarchivedObject to unarchive. Supply the class for the data and the data.

object = try NSKeyedUnarchiver.unarchivedObject(ofClass: YourClass.self, 
  from data)

If you are unarchiving an XML property list, you must do the following:

  • Create an instance of NSKeyedUnarchiver.
  • Call the decodeObject function to decode the object.
  • Call the finishDecoding function when you are finished.

The following code unarchives the object that the archive function archived earlier in the article:

let unarchiver = NSKeyedUnarchiver(forReadingFrom: data)
object = unarchiver.decodeObject(key: "root")
archiver.finishDecoding()

Newsletter Archive

You can read previous issues of the newsletter using the following button:

Swift Dev Journal

Subscribe and get exclusive articles on Swift development, a free guide on moving from tutorials to making your first app, notices of sales on books, and anything I decide to add in the future.

Read more from Swift Dev Journal

Find the Code Causing Long SwiftUI Updates with Instruments Instruments comes with a SwiftUI instrument to find performance problems in your SwiftUI apps. This article shows how to use Instruments to find the code that causes long SwiftUI view updates. If you have never used Instruments, read the following article to learn how to profile your app with the SwiftUI instrument: Find the SwiftUI Views that Update the Most Using Instruments Finding Long Updates When you finish profiling your app,...

When you profile your app with the Allocations instrument, you may want to find the largest memory allocations your app makes. Take the following steps to find the largest memory allocations: Press Cmd-3 to open the allocations list. Click the Size column heading to sort the allocations by size. Choose All Heap Allocations from the Allocation Type menu in the bottom bar to hide virtual memory allocations. Your code doesn’t directly make virtual memory allocations. The Allocation Type menu is...

A common problem people run into when they start profiling their apps with Instruments is finding the code that is causing problems. Many instruments initially show general statistics instead of statistics about the code you wrote. For example the Allocations instrument initially shows the number of memory allocations and amount of allocated memory for hundreds of memory categories. If your app allocates a lot of memory, you want to find the code that allocates high amounts of memory. How do...