22 Apr

Data Container Singletons in Swift




A demonstration of using a data container singleton in Swift to save application state and share it between objects.

You can download the project from Github at this link: SwiftDataContainerSingleton.

Project Description:

The DataContainerSingleton class is the actual singleton.

It uses a static property sharedDataContainer to save a reference to the singleton.

The first time another object tries to reference the sharedDataContainer property, the code above creates the single instance of DataContainerSingleton and saves it in the sharedDataContainer property.

To access the singleton, use the syntax

The sample project defines 3 properties in the data container:

To load the someInt property from the data container, you’d use code like this:

To save a value to someInt, you’d use the syntax:

The DataContainerSingleton’s init method adds an observer for the UIApplicationDidEnterBackgroundNotification. That code looks like this:

In the observer code it saves the data container’s properties to NSUserDefaults. You can also use NSCoding, Core Data, or various other methods for saving state data.

The DataContainerSingleton’s init method also tries to load saved values for it’s properties.

That portion of the init method looks like this:

The keys for loading and saving values into NSUserDefaults are stored as string constants that are part of a struct DefaultsKeys, defined like this:

You reference one of these constants like this:

Using the data container singleton:

This sample application makes trival use of the data container singleton.

There are two view controllers. The first is a custom subclass of UIViewController ViewController, and the second one is a custom subclass of UIViewController SecondVC.

Both view controllers have a text field on them, and both load a value from the data container singlelton’s someInt property into the text field in their viewWillAppear method, and both save the current value from the text field back into the `someInt’ of the data container.

The code to load the value into the text field is in the viewWillAppear: method:

The code to save the user-edited value back to the data container is in the view controllers’ textFieldShouldEndEditing methods:

You should load values into your user interface in viewWillAppear rather than viewDidLoad so that your UI updates each time the view controller is displayed.