-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTypeInstanceCache.swift
100 lines (88 loc) · 3.38 KB
/
TypeInstanceCache.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//
// TypeInstanceCache.swift
// FastAdapter
//
// Created by Fabian Terhorst on 12.07.18.
// Copyright © 2018 everHome. All rights reserved.
//
public class TypeInstanceCache<Itm: Item> {
weak var fastAdapter: FastAdapter<Itm>?
var typeInstances = [String: Itm]()
var supplementaryViewTypeInstances = [String: [String: Itm]]()
public init() {
}
public func register(items: [Itm]) -> Bool {
var allRegistered = true
for item in items {
if !register(item: item) {
allRegistered = false
}
}
return allRegistered
}
public func register(item: Itm) -> Bool {
let typeId = item.getType()
if typeInstances.index(forKey: typeId) == nil {
typeInstances[typeId] = item
_register(typeId: typeId, item: item)
return true
}
return false
}
public func register(item: Itm, forSupplementaryViewOfKind: String) -> Bool {
let typeId = item.getType()
let typeInstances = supplementaryViewTypeInstances[forSupplementaryViewOfKind]
if typeInstances == nil {
supplementaryViewTypeInstances[forSupplementaryViewOfKind] = [String: Itm]()
}
if typeInstances?.index(forKey: typeId) == nil {
supplementaryViewTypeInstances[forSupplementaryViewOfKind]?[typeId] = item
_register(typeId: typeId, item: item, forSupplementaryViewOfKind: forSupplementaryViewOfKind)
return true
}
return false
}
private func _register(typeId: String, item: Itm) {
if let listView = fastAdapter?.listView {
if let nib = item.getNib() {
listView.registerCell(nib, forCellWithReuseIdentifier: typeId)
} else {
listView.registerCell(item.getViewClass(), forCellWithReuseIdentifier: typeId)
}
}
}
private func _register(typeId: String, item: Itm, forSupplementaryViewOfKind: String) {
if let listView = fastAdapter?.listView {
if let nib = item.getNib() {
listView.registerCell(nib, forSupplementaryViewOfKind: forSupplementaryViewOfKind, withReuseIdentifier: typeId)
} else {
listView.registerCell(item.getViewClass(), forSupplementaryViewOfKind: forSupplementaryViewOfKind, withReuseIdentifier: typeId)
}
}
}
public subscript(typeId: String) -> Item? {
return typeInstances[typeId]
}
func clear() {
typeInstances.removeAll()
supplementaryViewTypeInstances.removeAll()
}
func renew() {
var registeredCells = fastAdapter?.listView?.registeredCells
for (typeId, item) in typeInstances {
if registeredCells == nil || registeredCells?.contains(typeId) == false {
if registeredCells == nil {
registeredCells = Set<String>()
}
registeredCells?.insert(typeId)
_register(typeId: typeId, item: item)
}
}
fastAdapter?.listView?.registeredCells = registeredCells
for (kind, typeInstances) in supplementaryViewTypeInstances {
for (typeId, item) in typeInstances {
_register(typeId: typeId, item: item, forSupplementaryViewOfKind: kind)
}
}
}
}