Swift的对象池模式及如何处理并发访问

对象池模式用来管理一组可重用的对象,可从对象池获取对象来完成任务,用完之后再还给对象池。
系统UITableViewCell的创建与分配就使用了对象池模式:dequeueReusableCell(withIdentifier:)
对象池模式可用于场景:固定个数可重用组件、队列最大并发数、信号量等

对象池模式及处理并发访问

final class Pool {
    
    private var data = [T]()
    
    // 创建串行队列
    private let serialQueue = DispatchQueue(label: "serialQueue")
    
    let semaphore:DispatchSemaphore
    
    init(items:[T]) {
        
        data.reserveCapacity(items.count)
        
        data.append(contentsOf: items)
        
        // 创建信号量
        semaphore = DispatchSemaphore(value: items.count)
        
    }
    
    func getFromPool() -> T? {
        
        var result:T?
        
        // 信号量-1
        semaphore.wait()
        
        serialQueue.sync {
            
            result = data.removeFirst()
            
        }
        
        return result
        
    }
    
    func returnToPool(item:T) {
        
        serialQueue.async {
            
            self.data.append(item)
            
            // 信号量+1
            self.semaphore.signal()
            
        }
        
    }
    
}

定义成泛型类便于在项目中复用代码。

如果觉得我的文章对您有用,请点击喜欢。您的支持将鼓励我继续创作!

大家有什么不懂或我哪里写错了都可以评论留言,我一定会回复的~

你可能感兴趣的:(Swift的对象池模式及如何处理并发访问)