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)
}

最新文章

  1. 一周试用yii开发一个带各种该有功能的web程序(三)
  2. asp.net MVC 过滤器使用案例:统一处理异常顺道精简代码
  3. iOS UIButton setTitle与setAttributedTitle
  4. 关于orapwd命令entries参数的探究
  5. asp.net 之 购物车
  6. C#设计模式——迭代器模式(Iterator Pattern)
  7. 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动
  8. apiCloud创建APP项目
  9. HttpModule的认识与深入理解及MVC运行机制
  10. Unity干中学——如何实现游戏截图?
  11. Google jsAPI托管你的js库
  12. 读Zepto源码之Ajax模块
  13. 上传到 App Store 时出错。
  14. Win7系统下,docker构建nginx+php7环境实践
  15. hive常用操作
  16. IIS调试ASP.NET Core项目
  17. openstack安装指南和在centos7上的安装指南
  18. Ubuntu Windows双系统重装windows后看不到ubuntu启动引导
  19. 无法获取链接服务器 &quot;XXX&quot; 的 OLE DB 访问接口 &quot;SQLNCLI10&quot; 的架构行集 &quot;DBSCHEMA_TABLES_INFO&quot;。该访问接口支持该接口,但使用该接口时返回了失败代码。
  20. 使用Highcharts生成折线图_at last

热门文章

  1. Java Struts2 (四)
  2. 139.00.009提高Github Clone速度
  3. 【Machine Learning】监督学习、非监督学习及强化学习对比
  4. andriod导入v4包导致的错误
  5. atom 常用配置
  6. redis集群搭建与管理
  7. redis基本操作命令
  8. sql server中同时执行select和update语句死锁问题
  9. 学习的矩阵微积分The matrix calculus you need for deep learning
  10. (名词 形容词 动词 副词)重读&amp;(冠词 介词 连词 代词 辅助词(Be))弱读