重用池:2個(gè)NSMutableSet的隊(duì)列秦踪,一個(gè)等待使用隊(duì)列掷伙,一個(gè)使用中的隊(duì)列检柬。
自定義的重用池使用方法:
DSQViewReusePool *pool=[DSQViewReusePool new];// 懶加載或只初始化一次使用
[pool reset];// 標(biāo)記所有視圖為可重用狀態(tài)
自定義的DSQViewReusePool.h類:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface DSQViewReusePool : NSObject
// 從重用池當(dāng)中取出一個(gè)可重用view
- (UIView *)dequeueReuseableView;
// 向重用池中添加一個(gè)視圖
- (void)addUseingView:(UIView *)view;
// 重置方法婿斥,將當(dāng)前使用中的視圖移動(dòng)到可重用隊(duì)列中
- (void)reset;
@end
NS_ASSUME_NONNULL_END
自定義的DSQViewReusePool.m類:
#import "DSQViewReusePool.h"
@interface DSQViewReusePool()
@property (nonatomic, strong) NSMutableSet *waitUsedQueue;// 等待使用的對(duì)立
@property (nonatomic, strong) NSMutableSet *usingQueue;// 使用中的隊(duì)列
@end
@implementation DSQViewReusePool
- (instancetype)init {
self=[super init];
if (self) {
_waitUsedQueue=[NSMutableSet set];
_usingQueue=[NSMutableSet set];
}
return self;
}
// 從重用池當(dāng)中取出一個(gè)可重用view
- (UIView *)dequeueReuseableView {
UIView *view=[_waitUsedQueue anyObject];
if (!view) {
return nil;
} else {
// 進(jìn)行隊(duì)列移動(dòng)
[_waitUsedQueue removeObject:view];
[_usingQueue addObject:view];
return view;
}
}
// 向重用池中添加一個(gè)視圖
- (void)addUseingView:(UIView *)view {
if (!view) {
return;
}
// 添加視圖到使用各種的隊(duì)列
[_usingQueue addObject:view];
}
// 重置方法,將當(dāng)前使用中的視圖移動(dòng)到可重用隊(duì)列中
- (void)reset {
UIView *view=nil;
while ((view=[_usingQueue anyObject])) {
// 從使用中隊(duì)列移除
[_usingQueue removeObject:view];
// 加入等待使用隊(duì)列
[_waitUsedQueue addObject:view];
}
}
@end