How to iterate over NSCache keys
Asked Answered
A

1

10

I need to make a dictionary like NSCache which is thread-safe for keeping a cache. However, once in a while, I would need to refresh the contents of the Cache. NSCache does not provide a method to iterate over its keys. What would be the alternative here? Using NSMutableDictionary with synchronization?

Advocaat answered 4/3, 2013 at 23:41 Comment(5)
This would require adding keys to NSMutableSet though when you are caching new things which in turn requires locking. So I'm not sure if this is a better approach than having NSMutableDictionary with locking except that you don't need to lock the set when you are reading from it.Advocaat
That's true, but as I said, NSCache has some other properties besides thread-safety that are not as easy to replicate with an NSMutableDictionary.Evangelineevangelism
Got it. Thanks for discussing this.Advocaat
Does it have to be iterated? Because there is always the -removeAllObjects route, or perhaps you could look into NSDiscardableContent.Dysgenic
I thought there would be a allKeys and allValues property in NSCache... makes one wonder why they don't exist.Imponderabilia
S
2

NSCache doesn't have such API. So, you should implement your own cache using NSMutaleDictionary or NSMapTable. The main idea is to track order of added objects and remove the older if countLimit is exceeded. This can be done using some ordered structure for storing keys in order of adding, e.g. NSMutableArray. Also, you should track memory warnings and cleanup you cache.

For thread-safety you can use any lock that you like (@synchronized, NSLock, etc.). And you definitely should take keyEnumerator and objectEnumerator from copy of your mutable storage.

You can look at thread-safe implementation with ability to iterate through keys and objects: VSCache

Stalinabad answered 10/9, 2018 at 12:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.