1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGModernViewStorage.m
2014-07-10 18:11:09 +04:00

131 lines
3.7 KiB
Objective-C

#import "TGModernViewStorage.h"
#import "TGModernView.h"
@interface TGModernViewStorage ()
{
NSMutableDictionary *_viewsByIdentifier;
NSMutableDictionary *_resurrectionViewsByIdentifier;
bool _resurrectionEnabled;
}
@end
@implementation TGModernViewStorage
- (instancetype)init
{
self = [super init];
if (self != nil)
{
_viewsByIdentifier = [[NSMutableDictionary alloc] init];
_resurrectionViewsByIdentifier = [[NSMutableDictionary alloc] init];
}
return self;
}
- (UIView<TGModernView> *)_dequeueViewFromQueues:(NSMutableDictionary *)queues withIdentifier:(NSString *)identifier viewStateIdentifier:(NSString *)viewStateIdentifier
{
NSMutableArray *enqueuedViews = [queues objectForKey:identifier];
if (enqueuedViews != nil)
{
UIView<TGModernView> *view = nil;
if (viewStateIdentifier != nil)
{
for (UIView<TGModernView> *candidateView in enqueuedViews)
{
if (TGStringCompare(candidateView.viewStateIdentifier, viewStateIdentifier))
{
//TGLog(@"(resurrected view %@:%@)", identifier, viewStateIdentifier);
view = candidateView;
break;
}
}
}
if (view == nil)
view = [enqueuedViews lastObject];
if (view != nil)
{
[enqueuedViews removeObject:view];
return view;
}
}
return nil;
}
- (UIView<TGModernView> *)dequeueViewWithIdentifier:(NSString *)identifier viewStateIdentifier:(NSString *)viewStateIdentifier
{
UIView<TGModernView> *view = nil;
if (_resurrectionViewsByIdentifier.count != 0)
view = [self _dequeueViewFromQueues:_resurrectionViewsByIdentifier withIdentifier:identifier viewStateIdentifier:viewStateIdentifier];
if (view == nil)
view = [self _dequeueViewFromQueues:_viewsByIdentifier withIdentifier:identifier viewStateIdentifier:viewStateIdentifier];
return view;
}
- (void)enqueueView:(UIView<TGModernView> *)view
{
NSString *identifier = [view viewIdentifier];
if (identifier == nil)
{
TGLog(@"***** enqueueView: view doesn't have valid identifier");
return;
}
NSMutableDictionary *concreteQueues = _resurrectionEnabled ? _resurrectionViewsByIdentifier : _viewsByIdentifier;
NSMutableArray *enqueuedViews = [concreteQueues objectForKey:identifier];
if (enqueuedViews == nil)
{
enqueuedViews = [[NSMutableArray alloc] init];
[concreteQueues setObject:enqueuedViews forKey:identifier];
}
if (!_resurrectionEnabled)
[view willBecomeRecycled];
[enqueuedViews addObject:view];
}
- (void)allowResurrectionForOperations:(dispatch_block_t)block
{
_resurrectionEnabled = true;
block();
_resurrectionEnabled = false;
[_resurrectionViewsByIdentifier enumerateKeysAndObjectsUsingBlock:^(NSString *identifier, NSArray *views, __unused BOOL *stop)
{
for (UIView<TGModernView> *view in views)
{
[view willBecomeRecycled];
}
NSMutableArray *enqueuedViews = [_viewsByIdentifier objectForKey:identifier];
if (enqueuedViews == nil)
{
enqueuedViews = [[NSMutableArray alloc] init];
[_viewsByIdentifier setObject:enqueuedViews forKey:identifier];
}
[enqueuedViews addObjectsFromArray:views];
}];
[_resurrectionViewsByIdentifier removeAllObjects];
}
- (void)clear
{
[_viewsByIdentifier removeAllObjects];
[_resurrectionViewsByIdentifier removeAllObjects];
_resurrectionEnabled = false;
}
@end