- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现一个线程安全的MutableDataContainer
。当然,我可以简单地添加一个用于写入和读取操作的锁,但是在我的项目中,我需要经常读取数据,因此我不想使用这种方法。
有谁知道NSCache
的实现方式?
最佳答案
我不能完全确定NSCache具体使用的锁定机制,但是我建议使用5种解决方案中的一种,尤其是在针对Apple平台的现代开发中,这可能是NSCache实现的方法之一。可能有5种以上,此列表并不详尽。我只是不包括更多内容,因为我认为Apple不会使用此处未包含的方法。
以下所有方法都可以使用,但我会尽量避免听起来好像对哪种方法更好有自己的见解(我们将看看效果如何),因为这并不是您真正要问的问题。另外,在这个问题上有很多意见,我不想为此大火。我将基于这些方法和我对Apple的看法,就如何实现NSCache提出自己的看法。
pthread_rwlock_rdlock
获得一个锁,对于写入,您可以使用pthread_rwlock_wrlock
获得一个锁。在下面,这本质上是一个递归锁,并且除非有写操作,否则实际上不应该阻止读取。这优化了更常见的读取路径,并安全地说明了较不常见的写入路径。对于更不常见的读/写操作,必须从根本上将其升级为写操作。使用pthread锁(或互斥锁)时,您可以根据自己的代码逻辑和内部定义良好的条件来优化锁,尽管我在这里不做介绍。 disaptch_sync
用于读取,将dispatch_async
用于写入。这与pthread RW锁在优化公用路径方面有所不同,因为读取和写入都是串行的。尽管它确实依赖GCD通过其底层队列优化来优化读取(例如,GCD确定何时针对dispatch_sync
调用适本地进行阻止)。对于更不常见的读/写操作,您只需将其视为读并使用dispatch_sync
即可。再说一次,因为这种方法与以前的方法有一个重要的区别,尽管读取应该通过GCD进行快速和优化,但它们仍然是串行的,从技术上讲仍然是相互阻塞的。 dispatch_sync
用于读取,将dispatch_barrier_async
用于写入。对于特殊的读/写情况,有dispatch_barrier_sync
专门用于此目的。在这个世界上,读取从不会相互阻塞,也不会阻塞,直到它们遇到障碍为止,该障碍是为写入和读取/写入保留的。这种方法还依赖于GCD来优化读取,但是通过使用并发队列,您选择不进行串行读取。因此,基本上由您来控制必须是串行的事物,并在需要这些操作时使用屏障。 NSLock
-这是Foundation框架的经典构造。尽管它的原始实现可能有所不同,但是最近我研究了它的内部构造,并且在我测试过的所有情况下,它本质上都是围绕相应pthread实现的Objective-C包装。 @synchronized()
-这是内置的Objective-C函数/关键字,提供锁定和异常处理。实际上,它的下面是一个带有异常处理程序的NSLock。使用它时,它既适用于读取,也适用于写入。在内部,它们被相同地对待,因此没有一个相对于另一个进行优化。您的锁与您传递给@synchronized(obj)
函数的对象相关联。因此,从本质上讲,无论在相应的``@synchronized(){}''块中如何使用或更改对象,您都将锁定对该对象的访问。 @synchonized()
却缺乏投资,这可以在Swift中看到。 GCD是Swift中同步的首选方法。
关于ios - iOS-NSCache如何确保线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441134/
我有 NSCache,我在其中加载和加载要在 Collection View 中显示的图像。当我必须将数据重新加载到 Collection View 时,我必须清理缓存,否则 Collection V
对于我的应用程序,我必须将一些 HTML 转换为 tableViews 中的 NSAttributedStrings。这是一个 CPU 密集型操作,所以我决定利用 NSCache 有效地将时间减半,因
当用户通过菜单在 View Controller 之间切换时,如果他有足够的内存,我想缓存它们。为此,我想使用 NSCache 来存储许多 UIViewControllers。 但是,我不确定如何告诉
我有一个 collectionView,它一次显示 9 张图像(200x300 像素)。不过,总数可能高达数百。 目前,如果图像在缓存中,我会检查 cellForItem。如果没有,我将从文件系统加载
我正在编写一个需要在缓存中存储一些图像的应用程序。我正在尝试使用 NSCache 来完成它,代码似乎很好,但不要将图像保存在缓存中。我有这段代码: 缓存是全局的,在.h中声明:NSCache *c
我目前使用 NSCache 的一个子类来存储一些图像(值)及其相应的名称(键),当应用程序位于前台时,它似乎工作正常。但是,当我按下主页按钮/用户进入后台并重新进入应用程序时,NSCache 是空的。
我正在研究一种相当简单的缓存机制,目前正在使用 NSCache(出于内存管理的原因)。问题是——缓存是否在两次启动之间持续存在?对我来说好像不行。 我可以很好地将对象放入缓存中,并且可以在应用程序运行
我已经实现了一个列表,其中异步加载了许多大图像。我正在使用 NSCache 的实例来存储这些 UIImage 文件。当我向下滚动时,我加载了越来越多的图像。我设置了它并分析了应用程序的分配情况,我注意
我的应用程序执行某些项目的搜索,并根据获得的每个结果下载图像。它在 tableView 上显示结果,每个结果一个单元格,每个单元格显示相应的图像。 如果已经使用相同的参数进行搜索,我想缓存图像以避免下
我目前使用 NSCache 的子类来存储一些图像(值)及其相应的名称(键),当应用程序位于前台时,它似乎工作正常。但是,当我按下主页按钮/用户进入后台并重新进入应用程序时,NSCache 是空的。 实
NSCache 的一些自动删除策略是什么? Apple的文档没有提到它们,我实验发现NSCache没有响应内存警告。 最佳答案 NSCache 不响应 UIApplicationDidReceiveM
NSCache是一个很少使用的工具,实际上看起来很有用。我创建了一个简单的实验来查看它是如何工作的,看起来它不会在内存不足的情况下自动逐出数据(或者我做错了什么!) - (void)viewDidLo
我注意到当应用程序进入后台时,NSCache 会逐出它的所有对象。那是预期的行为吗?有办法避免吗? 我希望它在设备内存不足时驱逐对象,而不是在应用进入后台时立即驱逐对象。 你知道任何有效的替代方案吗?
谁能举例说明如何使用 NSCache 缓存字符串?或者任何人都有一个很好的解释的链接?好像没找到啊。。 最佳答案 您使用它的方式与使用 NSMutableDictionary 的方式相同。不同之处在于
我正在使用 NSCache 来存储 webData。 webData=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:urlStr
我正在编写一个应用程序,需要保留一堆对象的内存缓存,但这不会失控,因此我计划使用 NSCache 来存储所有内容。看起来它会负责清理等工作,这对我来说太棒了。 我还想在启动之间保留缓存,因此我需要将缓
由于 NSCache 已更改为泛型类型 NSCache 现在,这就是我正在执行的代码片段但是,控制台正在打印 -“图像到缓存后”并调度主队列 CustomImageView,但执行的缓存中的图像没有显
我有一个 NSCache 的实例,例如:NSCache *imageCache; 它基本上用于保存一些具有不同 "@keys 的远程“图像”值“。我在开头的全局类中 alloc & init NSCa
我这辈子都想不出如何在 NSCache 中存储与可选项有关的任何内容。我可以理解直接存储一个可选的是没有意义的,但是存储一个数组或字典,其中一些选项可能是可选的,这似乎应该是可能的。 然而,一个简单的
这应该在我的任何给定表格行中显示一个占位符,除非存在该索引路径的图像。当我向下滚动时,先前 indexPath 中的图像会加载默认值而不是释放。我知道之前有人帮助我解决了同样的问题,但这是在我意识到缓
我是一名优秀的程序员,十分优秀!