Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift dictionary with weak reference keys?

Tags:

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?

like image 312
Ana Avatar asked Nov 23 '15 00:11

Ana


2 Answers

You are describing an NSMapTable. It gives you a dictionary-like thing with weak references to its keys and/or values.

like image 139
matt Avatar answered Sep 17 '22 13:09

matt


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.

like image 42
Rob Avatar answered Sep 17 '22 13:09

Rob