2015-11-23 39 views
9

假設我有一些代表網絡連接的對象。一旦這些連接斷開,關聯的對象就會消失。我不想掛在不再連接的連接對象上。Swift詞典與弱引用鍵?

我也想使用字典將某些數據與這些連接相關聯。所以我可能有代碼:

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

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

但上面的代碼意味着詞典將繼續,而我不希望Connection對象的引用。如果Connection對象消失,我寧願刪除關聯的條目,最好是自動刪除。

所以,我想:

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

但是,這是行不通的。什麼是一個很好的替代解決方案?

回答

13

您正在描述一個NSMapTable。它給你一個字典式的東西,它的鍵和/或值的引用很弱。

+3

不錯的文章在這裏:http://nshipster.com/nshashtable-and-nsmaptable/ – matt

+1

只需在服務器上編寫Swift的每個人都注意:Linux上不存在「NSMapTable」和「NSHashTable」,所以你會需要使用Rob的答案。 – Zoyt

2

您可以爲弱引用編寫泛型類型,就像他們在How do I declare an array of weak references in Swift?中所做的那樣。因爲您正在爲字典鍵執行此操作,所以必須經過一些額外的工作才能使其符合Hashable,但它可以完成。

雖然我個人不會使用連接對象作爲鍵。我使用網絡請求的唯一字符串標識符作爲密鑰(例如,NSURLSessionTasktaskIdentifier)。

這解決了收集的問題,保持對請求的強烈參考。

關於任務完成時刪除項目,我只是將這個清理任務完成邏輯的一部分。