swift實現一個對象池

1.建立一個對象池

對象池:對象池通常用來管理一組可重用的對象, 這些對象的集合叫作對象池。 組件能夠從對象池中借用對象, 完成一些任務以後將它歸還給對象池。 返回的對象用於知足調用組件的後續請求, 請求能夠來自一個組件, 也能夠來自多個組件。數組

要實現這樣一個功能, 須要注意兩點: 1.處理好併發請求;2.確保每次請求都能獲取到對象。併發

對於第一個問題, 能夠使用同步隊列, 進行併發保護。app

對於第二個問題, 能夠使用DispatchSemaphore來控制信號量,若是數組中有值則進入隊列取值,若是沒有可用對象則等待一直到有可用對象。async

一個簡單的對象池的實現方案以下所示:spa

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信號量類型仍是比較簡單的,code

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)
}
相關文章
相關標籤/搜索