一个线程安全的 iOS 仓库工厂。按需存储、获取和创建对象。
pod 'IVYPool'
import IVYPool
#import <IVYPool/IVYPool.h>
...
@property (nonatomic, copy, readwrite) id (^createBlock)(void);
@property (nonatomic, assign, readwrite) NSUInteger capacity;
...
/*
The instances you add, get and create should all be of this class or subclass
*/
- (instancetype)initWithClass:(Class)aClass;
/*
Create an instance using `createBlock`
*/
- (id)create;
/*
Add instance to the pool.
It will immediately be accsible with `getLast` or `takeLast`
*/
- (BOOL)add:(id)instance;
/*
Auto creates if none found - never returns nil
*/
- (id)takeFirstIn;
- (id)takeLastIn;
- (id)takeFirstInPreferablyMatching:(BOOL(^)(id instance))filter;
- (id)takeLastInPreferablyMatching:(BOOL(^)(id instance))filter;
/*
Does not auto create and may return nil
*/
- (id)getFirstIn;
- (id)getLastIn;
- (id)getFirstInMatching:(BOOL(^)(id instance))filter;
- (id)getLastInMatching:(BOOL(^)(id instance))filter;
- (id)getFirstInPreferablyMatching:(BOOL(^)(id instance))filter;
- (id)getLastInPreferablyMatching:(BOOL(^)(id instance))filter;
/*
Creates object using `createBlock`
*/
- (void)fill;
- (void)fillTo:(NSUInteger)mark;
/*
Removes objects from the pool
*/
- (NSArray *)drain;
- (NSArray *)drainHalf;
- (NSArray *)drainTo:(NSUInteger)mark;
如果 a
和 b
被添加到池中。 firstIn
指的是 a
,而 lastIn
指的是 b
。
在大多数情况下,我建议创建一个简单的外观。在这种情况下,IVYPagerReusePool 拥有一个 IVYPool,并创建了一个清晰简洁的 API。
@interface IVYPagerReusePool : NSObject
- (void)registerPageClass:(Class)pageClass forReuseIdentifier:(NSString *)reuseIdentifier;
- (Class)pageClassForReuseIdentifier:(NSString *)reuseIdentifier;
- (IVYArticlePage *)getAnyPageWithPath:(IVYPagerPath *)path;
- (IVYArticlePage *)getAnyPageWithIdentifier:(NSString *)identifier;
- (IVYArticlePage *)getAnyPageWithReuseIdentifier:(NSString *)reuseIdentifier;
- (NSArray <IVYArticlePage *> *)drainTo:(NSUInteger)mark;
- (BOOL)add:(IVYArticlePage *)page;
@end