swift实现一个对象池
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)
}
分类:
iOS开发
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· MQ 如何保证数据一致性?
· 《HelloGitHub》第 108 期