Make thumbnail logic thread-safe to being called on main thread.
This commit is contained in:
parent
a04aa259ed
commit
27fa5dc2ef
@ -85,8 +85,7 @@ private struct OWSThumbnailRequest {
|
||||
return attachment.isImage || attachment.isAnimated || attachment.isVideo
|
||||
}
|
||||
|
||||
// completion will only be called on success.
|
||||
// completion will be called async on the main thread.
|
||||
// success and failure will be called async _off_ the main thread.
|
||||
@objc
|
||||
public func ensureThumbnail(forAttachment attachment: TSAttachmentStream,
|
||||
thumbnailDimensionPoints: UInt,
|
||||
@ -114,13 +113,13 @@ private struct OWSThumbnailRequest {
|
||||
|
||||
do {
|
||||
let loadedThumbnail = try process(thumbnailRequest: thumbnailRequest)
|
||||
DispatchQueue.main.async {
|
||||
DispatchQueue.global().async {
|
||||
thumbnailRequest.success(loadedThumbnail)
|
||||
}
|
||||
} catch {
|
||||
Logger.error("Could not create thumbnail: \(error)")
|
||||
|
||||
DispatchQueue.main.async {
|
||||
DispatchQueue.global().async {
|
||||
thumbnailRequest.failure(error)
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
#import "NSData+Image.h"
|
||||
#import "OWSFileSystem.h"
|
||||
#import "TSAttachmentPointer.h"
|
||||
#import "Threading.h"
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#import <SignalServiceKit/SignalServiceKit-Swift.h>
|
||||
#import <YapDatabase/YapDatabase.h>
|
||||
@ -694,10 +695,16 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
|
||||
{
|
||||
OWSLoadedThumbnail *_Nullable loadedThumbnail;
|
||||
loadedThumbnail = [self loadedThumbnailWithThumbnailDimensionPoints:thumbnailDimensionPoints
|
||||
success:^(OWSLoadedThumbnail *loadedThumbnail) {
|
||||
success(loadedThumbnail.image);
|
||||
}
|
||||
failure:failure];
|
||||
success:^(OWSLoadedThumbnail *loadedThumbnail) {
|
||||
DispatchMainThreadSafe(^{
|
||||
success(loadedThumbnail.image);
|
||||
});
|
||||
}
|
||||
failure:^{
|
||||
DispatchMainThreadSafe(^{
|
||||
failure();
|
||||
});
|
||||
}];
|
||||
return loadedThumbnail.image;
|
||||
}
|
||||
|
||||
@ -737,7 +744,7 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
|
||||
|
||||
- (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;
|
||||
OWSLoadedThumbnail *_Nullable syncLoadedThumbnail = nil;
|
||||
@ -765,13 +772,23 @@ typedef void (^OWSLoadedThumbnailSuccess)(OWSLoadedThumbnail *loadedThumbnail);
|
||||
|
||||
- (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
|
||||
{
|
||||
OWSLoadedThumbnail *_Nullable loadedThumbnail = [self loadedThumbnailSmallSync];
|
||||
if (!loadedThumbnail) {
|
||||
DDLogInfo(@"Couldn't load small thumbnail sync.");
|
||||
return nil;
|
||||
}
|
||||
NSError *error;
|
||||
NSData *_Nullable data = [[self loadedThumbnailSmallSync] dataAndReturnError:&error];
|
||||
NSData *_Nullable data = [loadedThumbnail dataAndReturnError:&error];
|
||||
if (error || !data) {
|
||||
OWSFail(@"Couldn't load thumbnail data: %@", error);
|
||||
return nil;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user