Swiftのオブジェクトプールモードと同時アクセスの処理方法

1411 ワード

オブジェクト・プール・モードは、再利用可能なオブジェクトのセットを管理するために使用され、オブジェクト・プールからオブジェクトを取得してタスクを完了し、使用後にオブジェクト・プールに返すことができます.システム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()
            
        }
        
    }
    
}

汎用クラスとして定義すると、プロジェクトでコードを多重化しやすくなります.

私の文章があなたに役に立つと思ったら、好きなものをクリックしてください。あなたの支持は私に創作を続けることを奨励します!


皆さんが何か分からないことがあったり、私がどこか間違っていたりしたらコメントしてもいいです.私は必ず返事します.