swift实现一个对象池
2024-10-06 11:40:13
1.创建一个对象池
对象池:对象池一般用来管理一组可重用的对象, 这些对象的集合叫做对象池。 组件可以从对象池中借用对象, 完成一些任务之后将它归还给对象池。 返回的对象用于满足调用组件的后续请求, 请求可以来自一个组件, 也可以来自多个组件。
要实现这样一个功能, 需要注意两点: 1.处理好并发请求;2.确保每次请求都能获取到对象。
对于第一个问题, 可以使用同步队列, 进行并发保护。
对于第二个问题, 可以使用DispatchSemaphore
来控制信号量,如果数组中有值则进入队列取值,如果没有可用对象则等待一直到有可用对象。
一个简单的对象池的实现方案如下所示:
class Pool<T> {
private var data = [T]()
private var arrayQueue = dispatch_queue_serial_t(label: "arrayQ")
private var semaphore: DispatchSemaphore
init(items: [T]) {
data.reserveCapacity(items.count)
data.append(contentsOf: items)
semaphore = DispatchSemaphore(value: items.count)
}
func getItemFromPool() -> T {
var result: T?
if semaphore.wait(timeout: DispatchTime.distantFuture) == 0 {
arrayQueue.sync {
result = data.popLast()
}
}
}
func returnToPool(item: T) {
arrayQueue.async {
self.data.append(contentsOf: item)
semaphore.signal()
}
}
}
2: DispatchSemaphore
DispatchSemaphore
信号量类型还是比较简单的,
open class DispatchSemaphore : DispatchObject {
}
/// dispatch_semaphore
extension DispatchSemaphore {
//提高信号量
public func signal() -> Int
//等待降低信号量
public func wait()
public func wait(timeout: DispatchTime) -> DispatchTimeoutResult
public func wait(wallTimeout: DispatchWallTime) -> DispatchTimeoutResult
}
extension DispatchSemaphore {
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
@available(iOS 4.0, *)
public /*not inherited*/ init(value: Int)
}
最新文章
- 一周试用yii开发一个带各种该有功能的web程序(三)
- asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
- iOS UIButton setTitle与setAttributedTitle
- 关于orapwd命令entries参数的探究
- asp.net 之 购物车
- C#设计模式——迭代器模式(Iterator Pattern)
- 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动
- apiCloud创建APP项目
- HttpModule的认识与深入理解及MVC运行机制
- Unity干中学——如何实现游戏截图?
- Google jsAPI托管你的js库
- 读Zepto源码之Ajax模块
- 上传到 App Store 时出错。
- Win7系统下,docker构建nginx+php7环境实践
- hive常用操作
- IIS调试ASP.NET Core项目
- openstack安装指南和在centos7上的安装指南
- Ubuntu Windows双系统重装windows后看不到ubuntu启动引导
- 无法获取链接服务器 ";XXX"; 的 OLE DB 访问接口 ";SQLNCLI10"; 的架构行集 ";DBSCHEMA_TABLES_INFO";。该访问接口支持该接口,但使用该接口时返回了失败代码。
- 使用Highcharts生成折线图_at last
热门文章
- Java Struts2 (四)
- 139.00.009提高Github Clone速度
- 【Machine Learning】监督学习、非监督学习及强化学习对比
- andriod导入v4包导致的错误
- atom 常用配置
- redis集群搭建与管理
- redis基本操作命令
- sql server中同时执行select和update语句死锁问题
- 学习的矩阵微积分The matrix calculus you need for deep learning
- (名词 形容词 动词 副词)重读&;(冠词 介词 连词 代词 辅助词(Be))弱读