Avoid unnecessariy flashing avatars

Make avatar building sync

Tests on a iPhone5 with 1k threads, 3k contacts show no noticeable lag.

Profiling shows ~4% of usage goes to contact avatar building, but once
cached, even that goes towards zero.

// FREEBIE
pull/1/head
Michael Kirk 8 years ago
parent 092578045e
commit 742f8cf902

@ -11,8 +11,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSAvatarBuilder : NSObject @interface OWSAvatarBuilder : NSObject
+ (UIImage *)buildImageForThread:(TSThread *)thread + (UIImage *)buildImageForThread:(TSThread *)thread
contactsManager:(OWSContactsManager *)contactsManager diameter:(NSUInteger)diameter
diameter:(NSUInteger)diameter; contactsManager:(OWSContactsManager *)contactsManager NS_SWIFT_NAME(buildImage(thread:diameter:contactsManager:));
- (nullable UIImage *)buildSavedImage; - (nullable UIImage *)buildSavedImage;
- (UIImage *)buildDefaultImage; - (UIImage *)buildDefaultImage;

@ -13,8 +13,8 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSAvatarBuilder @implementation OWSAvatarBuilder
+ (UIImage *)buildImageForThread:(TSThread *)thread + (UIImage *)buildImageForThread:(TSThread *)thread
contactsManager:(OWSContactsManager *)contactsManager
diameter:(NSUInteger)diameter diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
{ {
OWSAvatarBuilder *avatarBuilder; OWSAvatarBuilder *avatarBuilder;
if ([thread isKindOfClass:[TSContactThread class]]) { if ([thread isKindOfClass:[TSContactThread class]]) {

@ -95,7 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
textColor:[UIColor whiteColor] textColor:[UIColor whiteColor]
font:[UIFont ows_boldFontWithSize:fontSize] font:[UIFont ows_boldFontWithSize:fontSize]
diameter:self.diameter] avatarImage]; diameter:self.diameter] avatarImage];
[self.contactsManager.avatarCache setObject:image forKey:self.signalId]; [self.contactsManager.avatarCache setObject:image forKey:cacheKey];
return image; return image;
} }

@ -1,5 +1,6 @@
// Created by Michael Kirk on 9/26/16. //
// Copyright © 2016 Open Whisper Systems. All rights reserved. // Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import "OWSGroupAvatarBuilder.h" #import "OWSGroupAvatarBuilder.h"
#import "TSGroupThread.h" #import "TSGroupThread.h"
@ -32,7 +33,12 @@ NS_ASSUME_NONNULL_BEGIN
- (UIImage *)buildDefaultImage - (UIImage *)buildDefaultImage
{ {
return [UIImage imageNamed:@"empty-group-avatar"]; static UIImage *defaultGroupImage;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
defaultGroupImage = [UIImage imageNamed:@"empty-group-avatar"];
});
return defaultGroupImage;
} }
@end @end

@ -399,7 +399,7 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver,
} }
func updateAvatarImage() { func updateAvatarImage() {
contactAvatarView.image = OWSAvatarBuilder.buildImage(for: thread, contactsManager: contactsManager, diameter:400) contactAvatarView.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: 400, contactsManager: contactsManager)
} }
func createIncomingCallControls() { func createIncomingCallControls() {

@ -20,7 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
#define DATE_LABEL_SIZE 13 #define DATE_LABEL_SIZE 13
#define SWIPE_ARCHIVE_OFFSET -50 #define SWIPE_ARCHIVE_OFFSET -50
const NSUInteger kavatarViewDiameter = 52; const NSUInteger kAvatarViewDiameter = 52;
@interface InboxTableViewCell () @interface InboxTableViewCell ()
@ -227,16 +227,8 @@ const NSUInteger kavatarViewDiameter = 52;
self.unreadLabel.hidden = YES; self.unreadLabel.hidden = YES;
} }
NSString *threadIdCopy = thread.uniqueId; self.avatarView.image =
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [OWSAvatarBuilder buildImageForThread:thread diameter:kAvatarViewDiameter contactsManager:contactsManager];
UIImage *avatar =
[OWSAvatarBuilder buildImageForThread:thread contactsManager:contactsManager diameter:kavatarViewDiameter];
dispatch_async(dispatch_get_main_queue(), ^{
if ([_threadId isEqualToString:threadIdCopy]) {
self.avatarView.image = avatar;
}
});
});
} }
- (void)updateCellForUnreadMessage { - (void)updateCellForUnreadMessage {

@ -575,11 +575,11 @@ NS_ASSUME_NONNULL_BEGIN
[threadInfoView autoPinHeightToSuperviewWithMargin:16.f]; [threadInfoView autoPinHeightToSuperviewWithMargin:16.f];
const NSUInteger kAvatarSize = 68; const NSUInteger kAvatarSize = 68;
UIImage *avatar = UIImage *avatarImage =
[OWSAvatarBuilder buildImageForThread:self.thread contactsManager:self.contactsManager diameter:kAvatarSize]; [OWSAvatarBuilder buildImageForThread:self.thread diameter:kAvatarSize contactsManager:self.contactsManager];
OWSAssert(avatar); OWSAssert(avatarImage);
AvatarImageView *avatarView = [[AvatarImageView alloc] initWithImage:avatar]; AvatarImageView *avatarView = [[AvatarImageView alloc] initWithImage:avatarImage];
_avatarView = avatarView; _avatarView = avatarView;
[threadInfoView addSubview:avatarView]; [threadInfoView addSubview:avatarView];
[avatarView autoVCenterInSuperview]; [avatarView autoVCenterInSuperview];

@ -139,8 +139,8 @@ const NSUInteger kContactTableViewCellAvatarSize = 40;
self.nameLabel.attributedText = attributedText; self.nameLabel.attributedText = attributedText;
self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread
contactsManager:contactsManager diameter:kContactTableViewCellAvatarSize
diameter:kContactTableViewCellAvatarSize]; contactsManager:contactsManager];
// Force layout, since imageView isn't being initally rendered on App Store optimized build. // Force layout, since imageView isn't being initally rendered on App Store optimized build.
[self layoutSubviews]; [self layoutSubviews];

Loading…
Cancel
Save