What is a Semi-Singleton?
You all know the Singleton pattern. A Semi-Singleton will be an object that will be returned as an already existing instance or a new one depending on whether there was already an instance in memory for the given id.
Here’s an example of a lifecycle of a Semi-Singleton object:
- A first client (
client1) requests a semi-singleton object with id
obj. Such an object does not already exists: it is instantiated.
client1keeps a strong reference to this object for now.
- A second client (
client2) requests a semi-singleton object with id
obj. As the object already exists in memory, the same instance
client1uses is returned.
client2release the semi-singleton they share. It is fully deallocated.
- A third client requests a semi-singleton object with id
obj. As the previous semi-singleton with this id does not exist anymore, a new object is instantiated.
In code, a Semi-Singleton is any object conforming to the
How to use a Semi-Singleton?
/* First you need a “Store” that will hold the reference to the existing semi-singletons. */ let semiSingletonStore = SemiSingletonStore(forceClassInKeys: true) /* To retrieve a semi-singleton instance, you ask the store to give you one. */ let s: MySemiSingleton = semiSingletonStore.semiSingleton(forKey: key)
An “Action” object, when running the action twice for the same subject makes no sense. The subject would be the Semi-Singleton key. When the action is instantiated, If there is already an action in progress for the given subject, the already existing action will be returned, otherwise a new one is created.