1.创建一个对象池

对象池:对象池一般用来管理一组可重用的对象, 这些对象的集合叫做对象池。 组件可以从对象池中借用对象, 完成一些任务之后将它归还给对象池。 返回的对象用于满足调用组件的后续请求, 请求可以来自一个组件, 也可以来自多个组件。

要实现这样一个功能, 需要注意两点: 1.处理好并发请求;2.确保每次请求都能获取到对象。

对于第一个问题, 可以使用同步队列, 进行并发保护。

对于第二个问题, 可以使用DispatchSemaphore来控制信号量,如果数组中有值则进入队列取值,如果没有可用对象则等待一直到有可用对象。

一个简单的对象池的实现方案如下所示:

  1. class Pool<T> {
  2. private var data = [T]()
  3. private var arrayQueue = dispatch_queue_serial_t(label: "arrayQ")
  4. private var semaphore: DispatchSemaphore
  5. init(items: [T]) {
  6. data.reserveCapacity(items.count)
  7. data.append(contentsOf: items)
  8. semaphore = DispatchSemaphore(value: items.count)
  9. }
  10. func getItemFromPool() -> T {
  11. var result: T?
  12. if semaphore.wait(timeout: DispatchTime.distantFuture) == 0 {
  13. arrayQueue.sync {
  14. result = data.popLast()
  15. }
  16. }
  17. }
  18. func returnToPool(item: T) {
  19. arrayQueue.async {
  20. self.data.append(contentsOf: item)
  21. semaphore.signal()
  22. }
  23. }
  24. }

2: DispatchSemaphore

DispatchSemaphore信号量类型还是比较简单的,

  1. open class DispatchSemaphore : DispatchObject {
  2. }
  3. /// dispatch_semaphore
  4. extension DispatchSemaphore {
  5. //提高信号量
  6. public func signal() -> Int
  7. //等待降低信号量
  8. public func wait()
  9. public func wait(timeout: DispatchTime) -> DispatchTimeoutResult
  10. public func wait(wallTimeout: DispatchWallTime) -> DispatchTimeoutResult
  11. }
  12. extension DispatchSemaphore {
  13. //创建信号量,参数:信号量的初值,如果小于0则会返回NULL
  14. @available(iOS 4.0, *)
  15. public /*not inherited*/ init(value: Int)
  16. }

swift实现一个对象池的更多相关文章

  1. 设计一个对象池(Anno.XObjectPool)

    设计一个.net对象池   对象池对于创建开销比较大的对象来说很有意义,为了优化程序的运行速度.避免频繁创建销毁开销比较大的对象,我们可以通过对象池来复用创建开销大的对象.对象池的思路比较简单,事先创 ...

  2. [Swift] 创建一个对象

    创建一个对象 先写一个People类 // // People.swift // Class // // Created by YouXianMing on 15/3/18. // Copyright ...

  3. C3p0连接池配置

    在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Connection co ...

  4. Java--对象池化技术 org.apache.commons.pool2.ObjectPool

    org.apache.commons.pool2.ObjectPool提供了对象池,开发的小伙伴们可以直接使用来构建一个对象池 使用该对象池具有两个简单的步骤: 1.创建对象工厂,org.apache ...

  5. 线程池ThreadPool的初探

    一.线程池的适用范围 在日常使用多线程开发的时候,一般都构造一个Thread示例,然后调用Start使之执行.如果一个线程它大部分时间花费在等待某个事件响应的发生然后才予以响应:或者如果在一定期间内重 ...

  6. Java-对象池

    对象池使用的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销. 并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销 ...

  7. Java之对象池

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  8. 【h5-egret】深入浅出对象池

    最近看到对象池这一块的东西,是频繁创建和删除类型游戏优化性能的一个解决方案. 简单来讲对象池就是个数组,把不用的对象放进去,因为数组还保存了对象的引用,所以对象不会被回收,等需要用的时候再从数组中取出 ...

  9. 用Java实现一个通用并发对象池

    这篇文章里我们主要讨论下如何在Java里实现一个对象池.最近几年,Java虚拟机的性能在各方面都得到了极大的提升,因此对大多数对象而言,已经没有必要通过对象池来提高性能了.根本的原因是,创建一个新的对 ...

随机推荐

  1. Python代码 变量None的使用

    代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是'if x is None': 第二种是 'if not x:': 第三种是'if not x is None'(这句这样理解更清晰 ...

  2. 【OBJC】数字转中文大写

    博客园都不知道怎么外链图片…… - (void)numToString:(double)num{ ; NSMutableString *szChMoney = [[NSMutableString al ...

  3. [PE格式分析] 4.IMAGE_FILE_HEADER

    源代码如下: typedef struct _IMAGE_FILE_HEADER { +04h WORD Machine; // 运行平台 +06h WORD NumberOfSections; // ...

  4. Python unittest模块心得(一)

    关于unittest模块的一些心得,主要是看官网的例子,加上一点自己的理解,官网地址:https://docs.python.org/3.6/library/unittest.html 基础概念介绍: ...

  5. tp.c

    calculate throughput /* gput.c: out.tr¤ò²òÀϤ·¤Æ¥¹¥ë¡¼¥×¥Ã¥ÈÆÃÀ­¤ò·×»»¤¹¤ë * out.et¤ò²òÀϤ·¤ÆºÆÁ÷¥¿¥ ...

  6. leetcode-distinct sequences

    Solution: when see question about two strings , DP should be considered first. We can abstract this ...

  7. Batch Normalization 笔记

    原理 BN的效果 Why BN works? 原理 输入层可以归一化,那么其他层也应该可以归一化.但是有个重要的问题,为什么要引入beta和gamma. 为什么要引入beta和gamma 不总是要标准 ...

  8. Linux中nmon的安装与使用

    一.下载nmon. 根据CPU的类型选择下载相应的版本:http://nmon.sourceforge.net/pmwiki.php?n=Site.Downloadwget http://source ...

  9. linux配置sudo

    编辑/etc/sudoers或者直接使用root用户运行visodu 添加如下两行:oracle  ALL=(ALL)       NOPASSWD: ALLoinstall        ALL=( ...

  10. ZT 3.1 依赖倒置原则的定义

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码http://www.mscenter.edu.cn/blog/k_eckelP58 Template 模式获得一种反向控制结构效果,这也是 ...