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

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. 基于svg.js实现对图形的拖拽、选择和编辑操作

    本文主要记录如何使用 svg.js 实现对图形的拖拽,选择,图像渲染及各类形状的绘制操作. 1.关于SVG SVG 是可缩放的矢量图形,使用XML格式定义图像,可以生成对应的DOM节点,便于对单个图形 ...

  2. Unity --- 关节组件

    一.简介 Unity提供了下面的关节组件:铰链关节(Hinge Joint).固定关节(Fixed Joint).弹簧关节(Spring Joint).角色关节(Character Joint).可配 ...

  3. 多线程 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法——读写锁SRWLock来解决这一 ...

  4. Windows下 Mysql启动报1067解决方法

    前几天刚入职安装了一下Mysql  刚开始能打开  今天去公司发现启动不了服务 报1067错误, 在网上查看了一些方法,好多种版本..以下是本人的解决方法 1.打开运行-事件查看器--Windows日 ...

  5. golang rest api example

    package main import ( "net/http" "github.com/gin-gonic/gin" "github.com/jin ...

  6. 体验SpringBoot

    体验SpringBoot 1.介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开 ...

  7. DOS下常用命令

    0,想进入某个驱动器,直接输入盘符即可.如:“d:”1,CD--进入指定目录 2,cls--清除显示器屏幕上的内容,使DOS提示符到屏幕左上角. 3,time--显示和设置DOS的系统时间 4,dir ...

  8. PHP error_log 实际运用

    PHP的error_log()函数合理用起来还真方便呢,来看下这个函数: error_log(message,type,destination,headers); 参数 描述 message 必需.规 ...

  9. Wifi密码破解

    Wifi密码破解1:通过字典(暴力)破解WIFI密码   简单破解WEP/WPA/WPA2加密的WIFI密码,平台kali-linux 工具:Aircrack-ng 过程很简单:先抓含有正确密码的握手 ...

  10. Java中多线程重复启动

    在面试时候经常被问到多线程的相关问题: 今天在测试的时候发现下面的代码会抛出异常: java.lang.IllegalThreadStateException public static void m ...