Skip to content

Instantly share code, notes, and snippets.

@michaeleisel
Created January 9, 2019 00:10
Show Gist options
  • Save michaeleisel/c34377bdbe6c3b96dd237617c835af99 to your computer and use it in GitHub Desktop.
Save michaeleisel/c34377bdbe6c3b96dd237617c835af99 to your computer and use it in GitHub Desktop.
import Foundation
import UIKit
class ViewPool {
private var freeViews: [UIView] = []
private var allViews: [UIView] = []
init() {
}
private func availableView() -> UIView {
if let view = freeViews.popLast() {
return view
}
let view = UIView()
allViews.append(view)
return view
}
func acquireView() -> PoolView {
return PoolView(view: availableView(), pool: self)
}
func releaseView(view: UIView) {
freeViews.append(view)
}
}
import Foundation
import UIKit
class PoolView {
private let view: UIView
private let pool: ViewPool
init(view: UIView, pool: ViewPool) {
self.view = view
self.pool = pool
}
deinit {
reset()
pool.releaseView(view: view)
}
func reset() {
frame = .zero
backgroundColor = nil
}
func addToSuperview(_ superview: UIView) {
superview.addSubview(view)
}
func removeFromSuperview() {
view.removeFromSuperview()
}
var backgroundColor: UIColor? {
get {
return view.backgroundColor
}
set {
view.backgroundColor = newValue
}
}
var frame: CGRect {
get {
return view.frame
}
set {
view.frame = newValue
}
}
}
// Test code...
import UIKit
class ViewController: UIViewController {
let pool: ViewPool = ViewPool()
lazy var greenView: PoolView? = pool.acquireView()
override func viewDidLoad() {
super.viewDidLoad()
if let greenView = greenView {
greenView.backgroundColor = .green
greenView.frame = CGRect(x: 20, y: 20, width: 100, height: 100)
greenView.addToSuperview(view)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
if let greenView = self.greenView {
greenView.removeFromSuperview()
}
self.greenView = nil
}
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.greenView = self.pool.acquireView()
if let greenView = self.greenView {
greenView.backgroundColor = .purple
greenView.frame = CGRect(x: 20, y: 20, width: 200, height: 200)
greenView.addToSuperview(self.view)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment