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()
}
}
}
汎用クラスとして定義すると、プロジェクトでコードを多重化しやすくなります.
私の文章があなたに役に立つと思ったら、好きなものをクリックしてください。あなたの支持は私に創作を続けることを奨励します!
皆さんが何か分からないことがあったり、私がどこか間違っていたりしたらコメントしてもいいです.私は必ず返事します.
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()
}
}
}
皆さんが何か分からないことがあったり、私がどこか間違っていたりしたらコメントしてもいいです.私は必ず返事します.