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:
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.
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.
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
/* 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)
For instance, an “Action” object, when care should be taken that only one action run at the same time for the same subject. 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.