Swift object pool design sample

0
35
Swift object pool design sample



· 1 min learn


On this fast tutorial I will clarify & present you tips on how to implement the item pool design sample utilizing the Swift programming language.

A generic object pool in Swift

The object pool sample is a creational design sample. The principle thought behind it’s that first you create a set of objects (a pool), you then purchase & launch objects from the pool, as a substitute of regularly creating and releasing them. 👍

Why? Efficiency enhancements. For instance the Dispatch framework makes use of an object pool sample to offer 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 pictures from the net, 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 quite a bit cheaper to allocate a small variety of employees (that’ll truly do the obtain job), than create a brand new one for each single picture obtain request. 🖼

What concerning the downsides of this sample? There are some. For instance you probably have employees in your pool, they could include states or delicate consumer information. It’s a must to be very cautious with them aka. reset every thing. Additionally if you’re working in a multi-threaded setting you need to make your pool thread-safe.

Right here is an easy generic thread-safe object pool class:

import Basis

class Pool {

    personal let lockQueue = DispatchQueue(label: "pool.lock.queue")
    personal let semaphore: DispatchSemaphore
    personal 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.world(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 strains. You might have the thread protected 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 so as to truly use the item pool.

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

Associated posts


On this article I’m going to indicate you tips on how to implement a fundamental occasion processing system in your modular Swift utility.


Study the iterator design sample through the use of some customized sequences, conforming to the IteratorProtocol from the Swift commonplace 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 govern objects utilizing a purposeful strategy.

LEAVE A REPLY

Please enter your comment!
Please enter your name here