ネットワーク接続を表すオブジェクトがいくつかあるとしましょう。これらの接続が切断されると、関連するオブジェクトは消えます。接続されなくなった接続オブジェクトに固執したくありません。
また、辞書を使用して、いくつかのデータをこれらの接続に関連付けたいと思います。だから私はコードを持っているかもしれません:
class Connection { ... }
class Metadata { ... }
var metadata: [Connection: Metadata] = [:]
しかし、上記のコードは、辞書が私が望まないConnection
オブジェクトへの参照を保持することを意味します。 Connection
オブジェクトが消えたときに、関連するエントリを、理想的には自動的に削除したいと思います。
だから私は試しました:
var metadata: [weak Connection: Metadata] = [:]
しかし、これは機能しません。これに対する良い代替ソリューションは何ですか?
NSMapTableについて説明しています。キーや値への参照が弱い辞書のようなものを提供します。
Swiftで弱参照の配列を宣言するにはどうすればよいですか? 辞書キーに対してこれを行うため、追加の作業を行う必要があります。 Hashable
に準拠させるためですが、それは可能です。
ただし、個人的には、接続オブジェクトをキーとして使用することはありません。キーとなるネットワークリクエストには一意の文字列識別子を使用します(例:taskIdentifier
の- NSURLSessionTask
)。
これにより、コレクションがリクエストへの強力な参照を維持するという懸念が解決されます。
タスクが完了したときのアイテムの削除に関しては、このクリーンアップをタスク完了ロジックの一部にします。