Let's say I have a some objects representing network connections. Once these connections are disconnected, the associated objects disappear. I don't want to hang on to a connection object which is no longer connected.
I also want to associate some data with these connections using a dictionary. So I might have the code:
class Connection { ... }
class Metadata { ... }
var metadata: [Connection: Metadata] = [:]
But the above code means that the dictionary will keep references to the Connection
objects which I don't want. I'd prefer to have the associated entries be removed, ideally automatically, when the Connection
objects disappear.
So I tried:
var metadata: [weak Connection: Metadata] = [:]
But this doesn't work. What is a good alternative solution to this?
You are describing an NSMapTable. It gives you a dictionary-like thing with weak references to its keys and/or values.
You can write a generic type for weak references like they did in How do I declare an array of weak references in Swift? Because you are doing this for the dictionary key, you have to go through some extra work to make it conform to Hashable
, but it can be done.
Personally, though, I wouldn't use the connection objects as the key. I use a unique string identifier for the network request be the key (e.g., the taskIdentifier
of the NSURLSessionTask
).
That resolves the concern of the collection maintaining a strong reference to the request.
Regarding the removing of the item when the task is done, I just make this clean-up part of the task completion logic.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With