-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFGReuseItemPool.m
124 lines (101 loc) · 3 KB
/
FGReuseItemPool.m
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// FGViewPool.m
// exibitour
//
// Created by 易元 白 on 15/3/9.
// Copyright (c) 2015年 cn.myzgstudio. All rights reserved.
//
#import "FGReuseItemPool.h"
@interface FGReuseItemPool()
@property (nonatomic, strong) NSMutableArray * mutableItems;
@property (nonatomic, strong) NSMutableArray * oldItems;
@property (nonatomic, strong) NSMutableArray * needAddItems;
@property (nonatomic, strong) NSMutableArray * needRemoveItems;
@end
@implementation FGReuseItemPool
- (NSMutableArray *)mutableItems
{
return (NSMutableArray *) _items;
}
- (void)setMutableItems:(NSMutableArray *)mutableItems
{
_items = mutableItems;
}
- (instancetype)init
{
self = [super init];
if (self) {
self.oldItems = [NSMutableArray array];
self.mutableItems = [NSMutableArray array];
self.needAddItems = [NSMutableArray array];
self.needRemoveItems = [NSMutableArray array];
}
return self;
}
- (instancetype)initWithArray:(NSArray *)array
{
self = [self init];
if (self) {
[self.mutableItems addObjectsFromArray:array];
}
return self;
}
- (void)prepareUpdateItems
{
NSMutableArray *temp = self.oldItems;
self.oldItems = self.mutableItems;
self.mutableItems = temp;
[self.mutableItems removeAllObjects];
[self.needAddItems removeAllObjects];
[self.needRemoveItems removeAllObjects];
}
- (id<FGWithReuseId>) updateItem: (NSString *) reuseId initBlock:(FGInitReuseItemBlock)initBlock outputIsNewView: (BOOL *)isNewView;
{
BOOL noOutIsNew;
if (isNewView == NULL) {
isNewView = &noOutIsNew;
}
UIView *foundReuseView = nil;
for (NSUInteger i = 0; i < self.oldItems.count; i++) {
UIView *view = self.oldItems[i];
if ([view.reuseId isEqualToString: reuseId]) {
foundReuseView = view;
for (NSUInteger j = 0; j < i; j++) {
[self.needRemoveItems addObject: self.oldItems[j]];
}
[self.oldItems removeObjectsInRange:NSMakeRange(0, i + 1)];
break;
}
}
id<FGWithReuseId> view = initBlock(foundReuseView);
view.reuseId = reuseId;
[self.mutableItems addObject: view];
*isNewView = view != nil && view != foundReuseView;
if (*isNewView) {
[self.needAddItems addObject: view];
}
if (foundReuseView != nil && view != foundReuseView) {
[self.needRemoveItems addObject: foundReuseView];
}
return view;
}
- (void) finishUpdateItems: (void(^)(id<FGWithReuseId>)) needAdd needRemove: (void(^)(id<FGWithReuseId>)) needRemove;
{
if (needAdd != nil) {
for (UIView *view in self.needAddItems) {
needAdd(view);
}
}
if (needRemove != nil){
for (UIView *view in self.needRemoveItems) {
needRemove(view);
}
for (UIView *view in self.oldItems) {
needRemove(view);
}
}
[self.needAddItems removeAllObjects];
[self.needRemoveItems removeAllObjects];
[self.oldItems removeAllObjects];
}
@end