From cf65cc3be591d51abefc3c88d73deb944f0d93b1 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Tue, 20 Jun 2017 17:39:33 -0400 Subject: [PATCH] Improve perf of attachment stream file path upgrade. // FREEBIE --- src/Messages/Attachments/TSAttachmentStream.h | 2 ++ src/Messages/Attachments/TSAttachmentStream.m | 27 ++++++------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/Messages/Attachments/TSAttachmentStream.h b/src/Messages/Attachments/TSAttachmentStream.h index c206198fd..2c763d37b 100644 --- a/src/Messages/Attachments/TSAttachmentStream.h +++ b/src/Messages/Attachments/TSAttachmentStream.h @@ -27,6 +27,8 @@ NS_ASSUME_NONNULL_BEGIN // This only applies for attachments being uploaded. @property (atomic) BOOL isUploaded; +@property (atomic) BOOL hasUnsavedFilePath; + #if TARGET_OS_IPHONE - (nullable UIImage *)image; #endif diff --git a/src/Messages/Attachments/TSAttachmentStream.m b/src/Messages/Attachments/TSAttachmentStream.m index 86d7ba36a..9365d0e98 100644 --- a/src/Messages/Attachments/TSAttachmentStream.m +++ b/src/Messages/Attachments/TSAttachmentStream.m @@ -129,29 +129,18 @@ NS_ASSUME_NONNULL_BEGIN OWSAssert(self.filePath); if (shouldPersist) { - // It's not ideal to do this asynchronously, but we can create a new transaction - // within initWithCoder: which will be called from within a transaction. - // - // We use a serial queue to ensure we don't spawn a ton of threads each doing - // database writes. - dispatch_async([TSAttachmentStream serialQueue], ^{ - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - OWSAssert(transaction); - - [self saveWithTransaction:transaction]; - }]; - }); + self.hasUnsavedFilePath = YES; } } -+ (dispatch_queue_t)serialQueue ++ (MTLPropertyStorage)storageBehaviorForPropertyWithKey:(NSString *)propertyKey { - static dispatch_queue_t queue = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - queue = dispatch_queue_create("org.whispersystems.attachment.stream", DISPATCH_QUEUE_SERIAL); - }); - return queue; + // Don't persist transient properties + if ([propertyKey isEqualToString:@"hasUnsavedFilePath"]) { + return MTLPropertyStorageNone; + } else { + return [super storageBehaviorForPropertyWithKey:propertyKey]; + } } #pragma mark - File Management