对象池模式用来管理一组可重用的对象,可从对象池获取对象来完成任务,用完之后再还给对象池。
系统UITableViewCell的创建与分配就使用了对象池模式:dequeueReusableCell(withIdentifier:)
对象池模式可用于场景:固定个数可重用组件、队列最大并发数、信号量等
对象池模式及处理并发访问
final class Pool<T> {
private var data = [T]()
// 创建串行队列
private let serialQueue = DispatchQueue(label: "serialQueue")
let semaphore:DispatchSemaphore
init(items:[T]) {
data.reserveCapacity(items.count)
data.append(contentsOf: items)
// 创建信号量
semaphore = DispatchSemaphore(value: items.count)
}
func getFromPool() -> T? {
var result:T?
// 信号量-1
semaphore.wait()
serialQueue.sync {
result = data.removeFirst()
}
return result
}
func returnToPool(item:T) {
serialQueue.async {
self.data.append(item)
// 信号量+1
self.semaphore.signal()
}
}
}
定义成泛型类便于在项目中复用代码。
如果觉得我的文章对您有用,请点击喜欢。您的支持将鼓励我继续创作!
大家有什么不懂或我哪里写错了都可以评论留言,我一定会回复的~
网友评论