vector-im/element-x-ios/issues/53 - Converted most callback based methods to async/await

This commit is contained in:
Stefan Ceriu
2022-05-24 16:59:01 +03:00
committed by Stefan Ceriu
parent f2fe39eca7
commit dde7786152
23 changed files with 407 additions and 454 deletions
@@ -16,21 +16,20 @@ struct EventBriefFactory: EventBriefFactoryProtocol {
self.memberDetailProvider = memberDetailProvider
}
func eventBriefForMessage(_ message: RoomMessageProtocol?, completion: @escaping ((EventBrief?) -> Void)) {
func eventBriefForMessage(_ message: RoomMessageProtocol?) async -> EventBrief? {
guard let message = message else {
completion(nil)
return
return nil
}
switch message {
case is ImageRoomMessage:
completion(nil)
return nil
case let message as TextRoomMessage:
buildEventBrief(message: message, htmlBody: message.htmlBody, completion: completion)
return await buildEventBrief(message: message, htmlBody: message.htmlBody)
case let message as NoticeRoomMessage:
buildEventBrief(message: message, htmlBody: message.htmlBody, completion: completion)
return await buildEventBrief(message: message, htmlBody: message.htmlBody)
case let message as EmoteRoomMessage:
buildEventBrief(message: message, htmlBody: message.htmlBody, completion: completion)
return await buildEventBrief(message: message, htmlBody: message.htmlBody)
default:
fatalError("Unknown room message.")
}
@@ -38,26 +37,24 @@ struct EventBriefFactory: EventBriefFactoryProtocol {
// MARK: - Private
private func buildEventBrief(message: RoomMessageProtocol, htmlBody: String?, completion: @escaping ((EventBrief?) -> Void)) {
memberDetailProvider.displayNameForUserId(message.sender) { result in
switch result {
case .success(let displayName):
completion(EventBrief(eventId: message.id,
senderId: message.sender,
senderDisplayName: displayName,
body: message.body,
htmlBody: htmlBody,
date: message.originServerTs))
case .failure(let error):
MXLog.error("Failed fetching sender display name with error: \(error)")
completion(EventBrief(eventId: message.id,
senderId: message.sender,
senderDisplayName: nil,
body: message.body,
htmlBody: htmlBody,
date: message.originServerTs))
}
private func buildEventBrief(message: RoomMessageProtocol, htmlBody: String?) async -> EventBrief? {
switch await memberDetailProvider.loadDisplayNameForUserId(message.sender) {
case .success(let displayName):
return EventBrief(eventId: message.id,
senderId: message.sender,
senderDisplayName: displayName,
body: message.body,
htmlBody: htmlBody,
date: message.originServerTs)
case .failure(let error):
MXLog.error("Failed fetching sender display name with error: \(error)")
return EventBrief(eventId: message.id,
senderId: message.sender,
senderDisplayName: nil,
body: message.body,
htmlBody: htmlBody,
date: message.originServerTs)
}
}
}
@@ -9,5 +9,5 @@
import Foundation
protocol EventBriefFactoryProtocol {
func eventBriefForMessage(_ message: RoomMessageProtocol?, completion: @escaping ((EventBrief?) -> Void))
func eventBriefForMessage(_ message: RoomMessageProtocol?) async -> EventBrief?
}
@@ -30,7 +30,7 @@ struct MockRoomSummary: RoomSummaryProtocol {
var avatar: UIImage?
func loadData() {
func loadDetails() {
}
@@ -71,81 +71,81 @@ class RoomSummary: RoomSummaryProtocol {
self.mediaProvider = mediaProvider
self.eventBriefFactory = eventBriefFactory
eventBriefFactory.eventBriefForMessage(roomProxy.messages.last) { [weak self] result in
self?.lastMessage = result
Task {
lastMessage = await eventBriefFactory.eventBriefForMessage(roomProxy.messages.last)
}
roomProxy.callbacks.sink { [weak self] callback in
guard let self = self else {
return
}
switch callback {
case .updatedMessages:
self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last) { [weak self] result in
self?.lastMessage = result
roomProxy.callbacks
.receive(on: DispatchQueue.main)
.sink { [weak self] callback in
guard let self = self else {
return
}
switch callback {
case .updatedMessages:
Task {
self.lastMessage = await eventBriefFactory.eventBriefForMessage(roomProxy.messages.last)
}
}
}
}
.store(in: &roomUpdateListeners)
.store(in: &roomUpdateListeners)
}
func loadData() {
func loadDetails() async {
if hasLoadedData {
return
}
loadDisplayName()
loadLastMessage()
loadAvatar()
await withTaskGroup(of: Void.self) { group in
group.addTask {
await self.loadDisplayName()
}
group.addTask {
await self.loadAvatar()
}
group.addTask {
await self.loadLastMessage()
}
}
hasLoadedData = true
}
// MARK: - Private
private func loadDisplayName() {
roomProxy.displayName { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let displayName):
self.displayName = displayName
case .failure(let error):
MXLog.error("Failed fetching room display name with error: \(error)")
}
private func loadDisplayName() async {
switch await roomProxy.loadDisplayName() {
case .success(let displayName):
self.displayName = displayName
case .failure(let error):
MXLog.error("Failed fetching room display name with error: \(error)")
}
}
private func loadLastMessage() {
if roomProxy.messages.last == nil {
roomProxy.paginateBackwards(count: 1) { [weak self] result in
guard let self = self else { return }
switch result {
case .success:
self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last) { [weak self] result in
self?.lastMessage = result
}
case .failure(let error):
MXLog.error("Failed back paginating with error: \(error)")
}
}
private func loadAvatar() async {
guard let avatarURL = roomProxy.avatarURL else {
return
}
switch await mediaProvider.loadImageFromURL(avatarURL) {
case .success(let avatar):
self.avatar = avatar
case .failure(let error):
MXLog.error("Failed fetching room avatar with error: \(error)")
}
}
private func loadAvatar() {
if let avatarURL = roomProxy.avatarURL {
mediaProvider.loadImageFromURL(avatarURL) { [weak self] result in
guard let self = self else { return }
switch result {
case .success(let image):
self.avatar = image
case .failure(let error):
MXLog.error("Failed fetching room avatar with error: \(error)")
}
}
private func loadLastMessage() async {
guard roomProxy.messages.last == nil else {
return
}
switch await roomProxy.paginateBackwards(count: 1) {
case .success:
self.lastMessage = await self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last)
case .failure(let error):
MXLog.error("Failed back paginating with error: \(error)")
}
}
}
@@ -28,5 +28,5 @@ protocol RoomSummaryProtocol {
var callbacks: PassthroughSubject<RoomSummaryCallback, Never> { get }
func loadData()
func loadDetails() async
}