1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-11 08:59:48 +01:00
Telegram/Watch/Extension/WKInterfaceImage+Signals.m
2015-10-01 19:19:52 +03:00

112 lines
2.7 KiB
Objective-C

#import "WKInterfaceImage+Signals.h"
#import <objc/runtime.h>
@interface WKInterfaceImage (Signals_Private)
@property (nonatomic, strong) SMetaDisposable *disposable;
@property (nonatomic, strong) id postponedImage;
@end
@implementation WKInterfaceImage (Signals)
+ (void)load
{
TGSwizzleMethodImplementation(self.class, NSSelectorFromString(@"dealloc"), @selector(tg_dealloc));
}
- (void)tg_dealloc
{
[self.disposable dispose];
[self tg_dealloc];
}
- (id)postponedImage
{
return objc_getAssociatedObject(self, @selector(postponedImage));
}
- (void)setPostponedImage:(id)image
{
objc_setAssociatedObject(self, @selector(postponedImage), image, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSInteger)version
{
return [objc_getAssociatedObject(self, @selector(version)) integerValue];
}
- (void)setVersion:(NSInteger)version
{
objc_setAssociatedObject(self, @selector(version), @(version), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (SMetaDisposable *)disposable
{
return objc_getAssociatedObject(self, @selector(disposable));
}
- (void)setDisposable:(SMetaDisposable *)disposable
{
objc_setAssociatedObject(self, @selector(disposable), disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (void)setSignal:(SSignal *)signal isVisible:(bool (^)(void))isVisible
{
if (self.disposable == nil)
self.disposable = [[SMetaDisposable alloc] init];
NSInteger version = ++self.version;
__weak WKInterfaceImage *weakSelf = self;
[self.disposable setDisposable:[[signal deliverOn:[SQueue mainQueue]] startWithNext:^(id next)
{
__strong WKInterfaceImage *strongSelf = weakSelf;
if (strongSelf == nil || strongSelf.version != version)
return;
bool shouldUpdate = true;
if (isVisible != nil)
shouldUpdate = isVisible();
if (shouldUpdate)
[strongSelf _setImageWithNext:next];
else
strongSelf.postponedImage = next;
} error:^(id error)
{
} completed:^
{
}]];
if (signal == nil)
[self setImage:nil];
}
- (void)updateIfNeeded
{
if (self.postponedImage == nil)
return;
UIImage *image = self.postponedImage;
self.postponedImage = nil;
[self _setImageWithNext:image];
}
- (void)_setImageWithNext:(id)next
{
if ([next isKindOfClass:[NSString class]])
[self setImageNamed:(NSString *)next];
else if ([next isKindOfClass:[NSData class]])
[self setImageData:(NSData *)next];
else if ([next isKindOfClass:[UIImage class]])
[self setImage:(UIImage *)next];
else if ([next isKindOfClass:[NSNull class]])
[self setImage:nil];
}
@end