Swift object pool design sample

Swift object pool design sample



· 1 min learn


On this fast tutorial I will clarify & present you methods to implement the thing pool design sample utilizing the Swift programming language.

A generic object pool in Swift

The object pool sample is a creational design sample. The primary concept behind it’s that first you create a set of objects (a pool), then you definately purchase & launch objects from the pool, as an alternative of continually creating and releasing them. 👍

Why? Efficiency enhancements. For instance the Dispatch framework makes use of an object pool sample to present pre-created queues for the builders, as a result of making a queue (with an related thread) is an comparatively costly operation.

One other use case of the object pool sample is employees. For instance you need to obtain a whole bunch of photographs from the online, however you’d prefer to obtain solely 5 concurrently you are able to do it with a pool of 5 employee objects. In all probability it’s going to be so much cheaper to allocate a small variety of employees (that’ll really do the obtain process), than create a brand new one for each single picture obtain request. 🖼

What concerning the downsides of this sample? There are some. For instance in case you have employees in your pool, they could comprise states or delicate consumer information. You must be very cautious with them aka. reset all the things. Additionally in case you are working in a multi-threaded surroundings you need to make your pool thread-safe.

Right here is a straightforward generic thread-safe object pool class:

import Basis

class Pool {

    non-public let lockQueue = DispatchQueue(label: "pool.lock.queue")
    non-public let semaphore: DispatchSemaphore
    non-public var gadgets = [T]()

    init(_ gadgets: [T]) {
        self.semaphore = DispatchSemaphore(worth: gadgets.depend)
        self.gadgets.reserveCapacity(gadgets.depend)
        self.gadgets.append(contentsOf: gadgets)
    }

    func purchase() -> T? {
        if self.semaphore.wait(timeout: .distantFuture) == .success, !self.gadgets.isEmpty {
            return self.lockQueue.sync {
                return self.gadgets.take away(at: 0)
            }
        }
        return nil
    }

    func launch(_ merchandise: T) {
        self.lockQueue.sync {
            self.gadgets.append(merchandise)
            self.semaphore.sign()
        }
    }
}


let pool = Pool(["a", "b", "c"])

let a = pool.purchase()
print("(a ?? "n/a") acquired")
let b = pool.purchase()
print("(b ?? "n/a") acquired")
let c = pool.purchase()
print("(c ?? "n/a") acquired")

DispatchQueue.international(qos: .default).asyncAfter(deadline: .now() + .seconds(2)) {
    if let merchandise = b {
        pool.launch(merchandise)
    }
}

print("No extra useful resource within the pool, blocking thread till...")
let x = pool.purchase()
print("(x ?? "n/a") acquired once more")

As you possibly can see the implementation is just some traces. You may have the thread secure array of the generic pool gadgets, a dispatch semaphore that’ll block if there aren’t any objects out there within the pool, and two strategies with the intention to really use the thing pool.

Within the pattern you possibly can see that if there aren’t any extra objects left within the pool, the present queue will probably be blocked till a useful resource is being freed & prepared to make use of. So be careful & don’t block the primary thread by accident! 😉

Associated posts


On this article I’m going to indicate you methods to implement a primary occasion processing system on your modular Swift software.


Be taught the iterator design sample by utilizing some customized sequences, conforming to the IteratorProtocol from the Swift customary library.


Discover ways to use lazy properties in Swift to enhance efficiency, keep away from optionals or simply to make the init course of extra clear.


Newbie’s information about optics in Swift. Discover ways to use lenses and prisms to control objects utilizing a practical method.

Leave a Reply

Your email address will not be published. Required fields are marked *