20

假设我有一些代表网络连接的对象。一旦断开这些连接,关联的对象就会消失。我不想挂在不再连接的连接对象上。

我还想使用字典将一些数据与这些连接相关联。所以我可能有代码:

class Connection { ... }
class Metadata { ... }

var metadata: [Connection: Metadata] = [:]

但是上面的代码意味着字典将保留对Connection我不想要的对象的引用。我希望在Connection对象消失时自动删除关联的条目。

所以我尝试了:

var metadata: [weak Connection: Metadata] = [:]

但这不起作用。对此有什么好的替代解决方案?

4

2 回答 2

31

您正在描述一个 NSMapTable。它给你一个类似字典的东西,对它的键和/或值的引用很弱。

于 2015-11-23T00:49:12.963 回答
3

您可以为弱引用编写泛型类型,就像他们在如何在 Swift 中声明弱引用数组?因为您是为字典键执行此操作,所以您必须经过一些额外的工作才能使其符合Hashable,但可以做到。

不过,就我个人而言,我不会使用连接对象作为键。我使用唯一的字符串标识符作为网络请求的键(例如,taskIdentifierof the NSURLSessionTask)。

这解决了集合保持对请求的强引用的担忧。

关于在任务完成时移除项目,我只是将这个清理部分作为任务完成逻辑。

于 2015-11-23T06:10:12.703 回答