diff --git a/iOSClient/Data/NCManageDatabase+Avatar.swift b/iOSClient/Data/NCManageDatabase+Avatar.swift index ab036dedbb..04d559b804 100644 --- a/iOSClient/Data/NCManageDatabase+Avatar.swift +++ b/iOSClient/Data/NCManageDatabase+Avatar.swift @@ -163,16 +163,16 @@ extension NCManageDatabase { func getImageAvatarLoaded(fileName: String, dispatchOnMainQueue: Bool = true, completion: @escaping (_ image: UIImage?, _ tblAvatar: tableAvatar?) -> Void) { - let directoryUserData = utilityFileSystem.directoryUserData - let fileNameLocalPath = utilityFileSystem.createServerUrl(serverUrl: directoryUserData, fileName: fileName) - let image = UIImage(contentsOfFile: fileNameLocalPath) - performRealmRead({ realm in return realm.objects(tableAvatar.self) .filter("fileName == %@", fileName) .first .map { tableAvatar(value: $0) } }, sync: false) { result in + let directoryUserData = self.utilityFileSystem.directoryUserData + let fileNameLocalPath = self.utilityFileSystem.createServerUrl(serverUrl: directoryUserData, fileName: fileName) + let image = UIImage(contentsOfFile: fileNameLocalPath) + if result == nil { self.utilityFileSystem.removeFile(atPath: fileNameLocalPath) } diff --git a/iOSClient/Data/NCManageDatabase+Metadata+Create.swift b/iOSClient/Data/NCManageDatabase+Metadata+Create.swift index f3a99a98b6..30d6471d69 100644 --- a/iOSClient/Data/NCManageDatabase+Metadata+Create.swift +++ b/iOSClient/Data/NCManageDatabase+Metadata+Create.swift @@ -175,13 +175,15 @@ extension NCManageDatabase { metadata.ocIdTransfer = file.ocId metadata.ownerId = file.ownerId metadata.ownerDisplayName = file.ownerDisplayName - metadata.lock = file.lock - metadata.lockOwner = file.lockOwner - metadata.lockOwnerEditor = file.lockOwnerEditor - metadata.lockOwnerType = file.lockOwnerType - metadata.lockOwnerDisplayName = file.lockOwnerDisplayName - metadata.lockTime = file.lockTime - metadata.lockTimeOut = file.lockTimeOut + if let lock = file.lock { + metadata.lock = true + metadata.lockOwner = lock.owner + metadata.lockOwnerEditor = lock.ownerEditor + metadata.lockOwnerType = lock.ownerType.rawValue + metadata.lockOwnerDisplayName = lock.ownerDisplayName + metadata.lockTime = lock.time + metadata.lockTimeOut = lock.time + } metadata.path = file.path metadata.permissions = file.permissions metadata.placePhotos = file.placePhotos diff --git a/iOSClient/Data/NCManageDatabase.swift b/iOSClient/Data/NCManageDatabase.swift index 0fc77e9509..9a4da61ff0 100644 --- a/iOSClient/Data/NCManageDatabase.swift +++ b/iOSClient/Data/NCManageDatabase.swift @@ -182,7 +182,7 @@ final class NCManageDatabase: @unchecked Sendable { let configuration = Realm.Configuration(fileURL: databaseFileUrl, schemaVersion: databaseSchemaVersion, objectTypes: objectTypes) - realmQueue.async { + realmQueue.async(qos: .userInitiated, flags: .enforceQoS) { do { Realm.Configuration.defaultConfiguration = configuration let realm = try Realm() @@ -285,7 +285,7 @@ final class NCManageDatabase: @unchecked Sendable { } } } else { - realmQueue.async { + realmQueue.async(qos: .userInitiated, flags: .enforceQoS) { autoreleasepool { do { let realm = try Realm() @@ -331,7 +331,7 @@ final class NCManageDatabase: @unchecked Sendable { realmQueue.sync(execute: executionBlock) } } else { - realmQueue.async(execute: executionBlock) + realmQueue.async(qos: .userInitiated, flags: .enforceQoS, execute: executionBlock) } } @@ -346,7 +346,7 @@ final class NCManageDatabase: @unchecked Sendable { #endif return await withCheckedContinuation { continuation in - realmQueue.async { + realmQueue.async(qos: .userInitiated, flags: .enforceQoS) { autoreleasepool { do { let realm = try Realm() @@ -370,7 +370,7 @@ final class NCManageDatabase: @unchecked Sendable { #endif await withCheckedContinuation { continuation in - realmQueue.async { + realmQueue.async(qos: .userInitiated, flags: .enforceQoS) { autoreleasepool { do { let realm = try Realm() diff --git a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift index 8695062c5f..f5a7f3cc2c 100644 --- a/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift +++ b/iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift @@ -299,16 +299,21 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { if !metadata.iconUrl.isEmpty { if let ownerId = getAvatarFromIconUrl(metadata: metadata) { let fileName = NCSession.shared.getFileName(urlBase: metadata.urlBase, user: ownerId) - self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in - if let image { - cell.filePreviewImageView?.image = image - } else { - cell.filePreviewImageView?.image = self.utility.loadUserImage(for: ownerId, displayName: nil, urlBase: metadata.urlBase) - } - - if !(tblAvatar?.loaded ?? false), - self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { - self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: ownerId, fileName: fileName, account: metadata.account, view: collectionView, isPreviewImageView: true)) + if let image = NCImageCache.shared.getImageCache(key: fileName) { + cell.filePreviewImageView?.image = image + } else { + self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in + if let image { + cell.filePreviewImageView?.image = image + NCImageCache.shared.addImageCache(image: image, key: fileName) + } else { + cell.filePreviewImageView?.image = self.utility.loadUserImage(for: ownerId, displayName: nil, urlBase: metadata.urlBase) + } + + if !(tblAvatar?.loaded ?? false), + self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { + self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: ownerId, fileName: fileName, account: metadata.account, view: collectionView, isPreviewImageView: true)) + } } } } @@ -383,19 +388,25 @@ extension NCCollectionViewCommon: UICollectionViewDataSource { // AVATAR if !metadata.ownerId.isEmpty, metadata.ownerId != metadata.userId { - cell.fileAvatarImageView?.contentMode = .scaleAspectFill - let fileName = NCSession.shared.getFileName(urlBase: metadata.urlBase, user: metadata.ownerId) - self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in - if let image { - cell.fileAvatarImageView?.image = image - } else { - cell.fileAvatarImageView?.image = self.utility.loadUserImage(for: metadata.ownerId, displayName: metadata.ownerDisplayName, urlBase: metadata.urlBase) - } + if let image = NCImageCache.shared.getImageCache(key: fileName) { + cell.fileAvatarImageView?.contentMode = .scaleAspectFill + cell.fileAvatarImageView?.image = image + } else { + self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in + if let image { + cell.fileAvatarImageView?.contentMode = .scaleAspectFill + cell.fileAvatarImageView?.image = image + NCImageCache.shared.addImageCache(image: image, key: fileName) + } else { + cell.fileAvatarImageView?.contentMode = .scaleAspectFill + cell.fileAvatarImageView?.image = self.utility.loadUserImage(for: metadata.ownerId, displayName: metadata.ownerDisplayName, urlBase: metadata.urlBase) + } - if !(tblAvatar?.loaded ?? false), - self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { - self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: metadata.ownerId, fileName: fileName, account: metadata.account, view: collectionView)) + if !(tblAvatar?.loaded ?? false), + self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty { + self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: metadata.ownerId, fileName: fileName, account: metadata.account, view: collectionView)) + } } } } diff --git a/iOSClient/NCImageCache.swift b/iOSClient/NCImageCache.swift index 6b7ce7fc7d..0f2f4dae33 100644 --- a/iOSClient/NCImageCache.swift +++ b/iOSClient/NCImageCache.swift @@ -106,10 +106,18 @@ final class NCImageCache: @unchecked Sendable { cache.setValue(image, forKey: ocId + etag + ext, cost: cost) } + func addImageCache(image: UIImage, key: String) { + cache.setValue(image, forKey: key) + } + func getImageCache(ocId: String, etag: String, ext: String) -> UIImage? { return cache.value(forKey: ocId + etag + ext) } + func getImageCache(key: String) -> UIImage? { + return cache.value(forKey: key) + } + func removeImageCache(ocIdPlusEtag: String) { for i in 0.. NSPredicate { var predicate = NSPredicate() let startServerUrl = self.utilityFileSystem.getHomeServer(session: session) + mediaPath - - var showBothPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND mediaSearch == true AND hasPreview == true AND (classFile == '\(NKTypeClassFile.image.rawValue)' OR classFile == '\(NKTypeClassFile.video.rawValue)') AND NOT (status IN %@)" - - var showOnlyPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND mediaSearch == true AND hasPreview == true AND classFile == %@ AND NOT (status IN %@)" + let showBothPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND mediaSearch == true AND hasPreview == true AND (classFile == '\(NKTypeClassFile.image.rawValue)' OR classFile == '\(NKTypeClassFile.video.rawValue)') AND NOT (status IN %@)" + let showOnlyPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND mediaSearch == true AND hasPreview == true AND classFile == %@ AND NOT (status IN %@)" if showOnlyImages { predicate = NSPredicate(format: showOnlyPredicateMediaString, session.account, startServerUrl, NKTypeClassFile.image.rawValue, global.metadataStatusHideInView) diff --git a/iOSClient/Networking/NCNetworking+WebDAV.swift b/iOSClient/Networking/NCNetworking+WebDAV.swift index 3cbbe0d4c4..0d6c023237 100644 --- a/iOSClient/Networking/NCNetworking+WebDAV.swift +++ b/iOSClient/Networking/NCNetworking+WebDAV.swift @@ -844,6 +844,9 @@ class NCOperationDownloadAvatar: ConcurrentOperation, @unchecked Sendable { if error == .success, let image { NCManageDatabase.shared.addAvatar(fileName: self.fileName, etag: etag ?? "") + #if !EXTENSION + NCImageCache.shared.addImageCache(image: image, key: self.fileName) + #endif DispatchQueue.main.async { let visibleCells: [UIView] = (self.view as? UICollectionView)?.visibleCells ?? (self.view as? UITableView)?.visibleCells ?? []