Introduced MemberDetailsProvider, caching user avatar urls and images. Various other tweaks and improvements.

This commit is contained in:
Stefan Ceriu
2022-03-18 13:40:25 +02:00
parent 120bcaf012
commit 2eae0f0573
22 changed files with 346 additions and 203 deletions
@@ -0,0 +1,58 @@
//
// MemberDetailsProvider.swift
// ElementX
//
// Created by Stefan Ceriu on 18/03/2022.
// Copyright © 2022 Element. All rights reserved.
//
import Foundation
enum MemberDetailsProviderError: Error {
case invalidRoomProxy
case failedRetrievingUserAvatarURL
}
class MemberDetailsProvider {
private let roomProxy: RoomProxyProtocol?
private let processingQueue = DispatchQueue(label: "MemberDetailsProviderProcessingQueue")
private var memberAvatars = [String: String]()
init(roomProxy: RoomProxyProtocol) {
self.roomProxy = roomProxy
}
func avatarURLForUserId(_ userId: String) -> String? {
self.memberAvatars[userId]
}
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, MemberDetailsProviderError>) -> Void) {
guard let roomProxy = roomProxy else {
return
}
if let avatarURL = avatarURLForUserId(userId) {
completion(.success(avatarURL))
}
processingQueue.async {
roomProxy.avatarURLForUserId(userId, completion: { [weak self] result in
guard let self = self else {
return
}
switch result {
case .success(let avatarURL):
DispatchQueue.main.async {
self.memberAvatars[userId] = avatarURL
completion(.success(avatarURL))
}
case .failure:
DispatchQueue.main.async {
completion(.failure(.failedRetrievingUserAvatarURL))
}
}
})
}
}
}
@@ -91,7 +91,7 @@ class RoomProxy: RoomProxyProtocol, Equatable {
}
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void) {
DispatchQueue.global(qos: .background).async {
processingQueue.async {
do {
let avatarURL = try self.room.memberAvatarUrl(userId: userId)
@@ -107,7 +107,7 @@ class RoomProxy: RoomProxyProtocol, Equatable {
}
func loadDisplayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void) {
DispatchQueue.global(qos: .background).async {
processingQueue.async {
do {
let displayName = try self.room.displayName()
@@ -123,7 +123,6 @@ class RoomProxy: RoomProxyProtocol, Equatable {
}
func paginateBackwards(count: UInt, callback: ((Result<[RoomMessageProtocol], RoomProxyError>) -> Void)?) {
MXLog.debug("Started backpaginating")
processingQueue.async {
guard let backwardStream = self.backwardStream else {
DispatchQueue.main.async {
@@ -136,8 +135,6 @@ class RoomProxy: RoomProxyProtocol, Equatable {
self.messageFactory.buildRoomMessageFrom(message)
}
MXLog.debug("Finished backpaginating")
DispatchQueue.main.async {
callback?(.success(messages))
if self.lastMessage == nil {