Make thumbnail logic thread-safe to being called on main thread.

pull/1/head
Matthew Chen 7 years ago
parent a04aa259ed
commit 27fa5dc2ef

@ -85,8 +85,7 @@ private struct OWSThumbnailRequest {
return attachment.isImage || attachment.isAnimated || attachment.isVideo return attachment.isImage || attachment.isAnimated || attachment.isVideo
} }
// completion will only be called on success. // success and failure will be called async _off_ the main thread.
// completion will be called async on the main thread.
@objc @objc
public func ensureThumbnail(forAttachment attachment: TSAttachmentStream, public func ensureThumbnail(forAttachment attachment: TSAttachmentStream,
thumbnailDimensionPoints: UInt, thumbnailDimensionPoints: UInt,
@ -114,13 +113,13 @@ private struct OWSThumbnailRequest {
do { do {
let loadedThumbnail = try process(thumbnailRequest: thumbnailRequest) let loadedThumbnail = try process(thumbnailRequest: thumbnailRequest)
DispatchQueue.main.async { DispatchQueue.global().async {
thumbnailRequest.success(loadedThumbnail) thumbnailRequest.success(loadedThumbnail)
} }
} catch { } catch {
Logger.error("Could not create thumbnail: \(error)") Logger.error("Could not create thumbnail: \(error)")
DispatchQueue.main.async { DispatchQueue.global().async {
thumbnailRequest.failure(error) thumbnailRequest.failure(error)
} }
} }

@ -7,6 +7,7 @@
#import "NSData+Image.h" #import "NSData+Image.h"
#import "OWSFileSystem.h" #import "OWSFileSystem.h"
#import "TSAttachmentPointer.h" #import "TSAttachmentPointer.h"
#import "Threading.h"
#import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVFoundation.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h> #import <SignalServiceKit/SignalServiceKit-Swift.h>
#import <YapDatabase/YapDatabase.h> #import <YapDatabase/YapDatabase.h>
@ -694,10 +695,16 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
{ {
OWSLoadedThumbnail *_Nullable loadedThumbnail; OWSLoadedThumbnail *_Nullable loadedThumbnail;
loadedThumbnail = [self loadedThumbnailWithThumbnailDimensionPoints:thumbnailDimensionPoints loadedThumbnail = [self loadedThumbnailWithThumbnailDimensionPoints:thumbnailDimensionPoints
success:^(OWSLoadedThumbnail *loadedThumbnail) { success:^(OWSLoadedThumbnail *loadedThumbnail) {
success(loadedThumbnail.image); DispatchMainThreadSafe(^{
} success(loadedThumbnail.image);
failure:failure]; });
}
failure:^{
DispatchMainThreadSafe(^{
failure();
});
}];
return loadedThumbnail.image; return loadedThumbnail.image;
} }
@ -737,7 +744,7 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (nullable OWSLoadedThumbnail *)loadedThumbnailSmallSync - (nullable OWSLoadedThumbnail *)loadedThumbnailSmallSync
{ {
__block dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block OWSLoadedThumbnail *_Nullable asyncLoadedThumbnail = nil; __block OWSLoadedThumbnail *_Nullable asyncLoadedThumbnail = nil;
OWSLoadedThumbnail *_Nullable syncLoadedThumbnail = nil; OWSLoadedThumbnail *_Nullable syncLoadedThumbnail = nil;
@ -765,13 +772,23 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
- (nullable UIImage *)thumbnailImageSmallSync - (nullable UIImage *)thumbnailImageSmallSync
{ {
return [self loadedThumbnailSmallSync].image; OWSLoadedThumbnail *_Nullable loadedThumbnail = [self loadedThumbnailSmallSync];
if (!loadedThumbnail) {
DDLogInfo(@"Couldn't load small thumbnail sync.");
return nil;
}
return loadedThumbnail.image;
} }
- (nullable NSData *)thumbnailDataSmallSync - (nullable NSData *)thumbnailDataSmallSync
{ {
OWSLoadedThumbnail *_Nullable loadedThumbnail = [self loadedThumbnailSmallSync];
if (!loadedThumbnail) {
DDLogInfo(@"Couldn't load small thumbnail sync.");
return nil;
}
NSError *error; NSError *error;
NSData *_Nullable data = [[self loadedThumbnailSmallSync] dataAndReturnError:&error]; NSData *_Nullable data = [loadedThumbnail dataAndReturnError:&error];
if (error || !data) { if (error || !data) {
OWSFail(@"Couldn't load thumbnail data: %@", error); OWSFail(@"Couldn't load thumbnail data: %@", error);
return nil; return nil;

Loading…
Cancel
Save