Skip to content

Commit 918928e

Browse files
Cache avatars (#3794)
* first fix * Update NCImageCache.swift * cache * Update NCNetworking+WebDAV.swift * enforceQoS * Update NCManageDatabase+Metadata+Create.swift
1 parent f846bdc commit 918928e

File tree

6 files changed

+63
-41
lines changed

6 files changed

+63
-41
lines changed

iOSClient/Data/NCManageDatabase+Avatar.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,16 +163,16 @@ extension NCManageDatabase {
163163
func getImageAvatarLoaded(fileName: String,
164164
dispatchOnMainQueue: Bool = true,
165165
completion: @escaping (_ image: UIImage?, _ tblAvatar: tableAvatar?) -> Void) {
166-
let directoryUserData = utilityFileSystem.directoryUserData
167-
let fileNameLocalPath = utilityFileSystem.createServerUrl(serverUrl: directoryUserData, fileName: fileName)
168-
let image = UIImage(contentsOfFile: fileNameLocalPath)
169-
170166
performRealmRead({ realm in
171167
return realm.objects(tableAvatar.self)
172168
.filter("fileName == %@", fileName)
173169
.first
174170
.map { tableAvatar(value: $0) }
175171
}, sync: false) { result in
172+
let directoryUserData = self.utilityFileSystem.directoryUserData
173+
let fileNameLocalPath = self.utilityFileSystem.createServerUrl(serverUrl: directoryUserData, fileName: fileName)
174+
let image = UIImage(contentsOfFile: fileNameLocalPath)
175+
176176
if result == nil {
177177
self.utilityFileSystem.removeFile(atPath: fileNameLocalPath)
178178
}

iOSClient/Data/NCManageDatabase+Metadata+Create.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,15 @@ extension NCManageDatabase {
175175
metadata.ocIdTransfer = file.ocId
176176
metadata.ownerId = file.ownerId
177177
metadata.ownerDisplayName = file.ownerDisplayName
178-
metadata.lock = file.lock
179-
metadata.lockOwner = file.lockOwner
180-
metadata.lockOwnerEditor = file.lockOwnerEditor
181-
metadata.lockOwnerType = file.lockOwnerType
182-
metadata.lockOwnerDisplayName = file.lockOwnerDisplayName
183-
metadata.lockTime = file.lockTime
184-
metadata.lockTimeOut = file.lockTimeOut
178+
if let lock = file.lock {
179+
metadata.lock = true
180+
metadata.lockOwner = lock.owner
181+
metadata.lockOwnerEditor = lock.ownerEditor
182+
metadata.lockOwnerType = lock.ownerType.rawValue
183+
metadata.lockOwnerDisplayName = lock.ownerDisplayName
184+
metadata.lockTime = lock.time
185+
metadata.lockTimeOut = lock.time
186+
}
185187
metadata.path = file.path
186188
metadata.permissions = file.permissions
187189
metadata.placePhotos = file.placePhotos

iOSClient/Data/NCManageDatabase.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ final class NCManageDatabase: @unchecked Sendable {
182182

183183
let configuration = Realm.Configuration(fileURL: databaseFileUrl, schemaVersion: databaseSchemaVersion, objectTypes: objectTypes)
184184

185-
realmQueue.async {
185+
realmQueue.async(qos: .userInitiated, flags: .enforceQoS) {
186186
do {
187187
Realm.Configuration.defaultConfiguration = configuration
188188
let realm = try Realm()
@@ -285,7 +285,7 @@ final class NCManageDatabase: @unchecked Sendable {
285285
}
286286
}
287287
} else {
288-
realmQueue.async {
288+
realmQueue.async(qos: .userInitiated, flags: .enforceQoS) {
289289
autoreleasepool {
290290
do {
291291
let realm = try Realm()
@@ -331,7 +331,7 @@ final class NCManageDatabase: @unchecked Sendable {
331331
realmQueue.sync(execute: executionBlock)
332332
}
333333
} else {
334-
realmQueue.async(execute: executionBlock)
334+
realmQueue.async(qos: .userInitiated, flags: .enforceQoS, execute: executionBlock)
335335
}
336336
}
337337

@@ -346,7 +346,7 @@ final class NCManageDatabase: @unchecked Sendable {
346346
#endif
347347

348348
return await withCheckedContinuation { continuation in
349-
realmQueue.async {
349+
realmQueue.async(qos: .userInitiated, flags: .enforceQoS) {
350350
autoreleasepool {
351351
do {
352352
let realm = try Realm()
@@ -370,7 +370,7 @@ final class NCManageDatabase: @unchecked Sendable {
370370
#endif
371371

372372
await withCheckedContinuation { continuation in
373-
realmQueue.async {
373+
realmQueue.async(qos: .userInitiated, flags: .enforceQoS) {
374374
autoreleasepool {
375375
do {
376376
let realm = try Realm()

iOSClient/Main/Collection Common/NCCollectionViewCommon+CollectionViewDataSource.swift

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -299,16 +299,21 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
299299
if !metadata.iconUrl.isEmpty {
300300
if let ownerId = getAvatarFromIconUrl(metadata: metadata) {
301301
let fileName = NCSession.shared.getFileName(urlBase: metadata.urlBase, user: ownerId)
302-
self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in
303-
if let image {
304-
cell.filePreviewImageView?.image = image
305-
} else {
306-
cell.filePreviewImageView?.image = self.utility.loadUserImage(for: ownerId, displayName: nil, urlBase: metadata.urlBase)
307-
}
308-
309-
if !(tblAvatar?.loaded ?? false),
310-
self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty {
311-
self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: ownerId, fileName: fileName, account: metadata.account, view: collectionView, isPreviewImageView: true))
302+
if let image = NCImageCache.shared.getImageCache(key: fileName) {
303+
cell.filePreviewImageView?.image = image
304+
} else {
305+
self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in
306+
if let image {
307+
cell.filePreviewImageView?.image = image
308+
NCImageCache.shared.addImageCache(image: image, key: fileName)
309+
} else {
310+
cell.filePreviewImageView?.image = self.utility.loadUserImage(for: ownerId, displayName: nil, urlBase: metadata.urlBase)
311+
}
312+
313+
if !(tblAvatar?.loaded ?? false),
314+
self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty {
315+
self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: ownerId, fileName: fileName, account: metadata.account, view: collectionView, isPreviewImageView: true))
316+
}
312317
}
313318
}
314319
}
@@ -383,19 +388,25 @@ extension NCCollectionViewCommon: UICollectionViewDataSource {
383388

384389
// AVATAR
385390
if !metadata.ownerId.isEmpty, metadata.ownerId != metadata.userId {
386-
cell.fileAvatarImageView?.contentMode = .scaleAspectFill
387-
388391
let fileName = NCSession.shared.getFileName(urlBase: metadata.urlBase, user: metadata.ownerId)
389-
self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in
390-
if let image {
391-
cell.fileAvatarImageView?.image = image
392-
} else {
393-
cell.fileAvatarImageView?.image = self.utility.loadUserImage(for: metadata.ownerId, displayName: metadata.ownerDisplayName, urlBase: metadata.urlBase)
394-
}
392+
if let image = NCImageCache.shared.getImageCache(key: fileName) {
393+
cell.fileAvatarImageView?.contentMode = .scaleAspectFill
394+
cell.fileAvatarImageView?.image = image
395+
} else {
396+
self.database.getImageAvatarLoaded(fileName: fileName) { image, tblAvatar in
397+
if let image {
398+
cell.fileAvatarImageView?.contentMode = .scaleAspectFill
399+
cell.fileAvatarImageView?.image = image
400+
NCImageCache.shared.addImageCache(image: image, key: fileName)
401+
} else {
402+
cell.fileAvatarImageView?.contentMode = .scaleAspectFill
403+
cell.fileAvatarImageView?.image = self.utility.loadUserImage(for: metadata.ownerId, displayName: metadata.ownerDisplayName, urlBase: metadata.urlBase)
404+
}
395405

396-
if !(tblAvatar?.loaded ?? false),
397-
self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty {
398-
self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: metadata.ownerId, fileName: fileName, account: metadata.account, view: collectionView))
406+
if !(tblAvatar?.loaded ?? false),
407+
self.networking.downloadAvatarQueue.operations.filter({ ($0 as? NCOperationDownloadAvatar)?.fileName == fileName }).isEmpty {
408+
self.networking.downloadAvatarQueue.addOperation(NCOperationDownloadAvatar(user: metadata.ownerId, fileName: fileName, account: metadata.account, view: collectionView))
409+
}
399410
}
400411
}
401412
}

iOSClient/NCImageCache.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,18 @@ final class NCImageCache: @unchecked Sendable {
106106
cache.setValue(image, forKey: ocId + etag + ext, cost: cost)
107107
}
108108

109+
func addImageCache(image: UIImage, key: String) {
110+
cache.setValue(image, forKey: key)
111+
}
112+
109113
func getImageCache(ocId: String, etag: String, ext: String) -> UIImage? {
110114
return cache.value(forKey: ocId + etag + ext)
111115
}
112116

117+
func getImageCache(key: String) -> UIImage? {
118+
return cache.value(forKey: key)
119+
}
120+
113121
func removeImageCache(ocIdPlusEtag: String) {
114122
for i in 0..<allowExtensions.count {
115123
cache.removeValue(forKey: ocIdPlusEtag + allowExtensions[i])
@@ -128,10 +136,8 @@ final class NCImageCache: @unchecked Sendable {
128136
showOnlyVideos: Bool) -> NSPredicate {
129137
var predicate = NSPredicate()
130138
let startServerUrl = self.utilityFileSystem.getHomeServer(session: session) + mediaPath
131-
132-
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 %@)"
133-
134-
var showOnlyPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND mediaSearch == true AND hasPreview == true AND classFile == %@ AND NOT (status IN %@)"
139+
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 %@)"
140+
let showOnlyPredicateMediaString = "account == %@ AND serverUrl BEGINSWITH %@ AND mediaSearch == true AND hasPreview == true AND classFile == %@ AND NOT (status IN %@)"
135141

136142
if showOnlyImages {
137143
predicate = NSPredicate(format: showOnlyPredicateMediaString, session.account, startServerUrl, NKTypeClassFile.image.rawValue, global.metadataStatusHideInView)

iOSClient/Networking/NCNetworking+WebDAV.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,9 @@ class NCOperationDownloadAvatar: ConcurrentOperation, @unchecked Sendable {
844844

845845
if error == .success, let image {
846846
NCManageDatabase.shared.addAvatar(fileName: self.fileName, etag: etag ?? "")
847+
#if !EXTENSION
848+
NCImageCache.shared.addImageCache(image: image, key: self.fileName)
849+
#endif
847850

848851
DispatchQueue.main.async {
849852
let visibleCells: [UIView] = (self.view as? UICollectionView)?.visibleCells ?? (self.view as? UITableView)?.visibleCells ?? []

0 commit comments

Comments
 (0)