vector-im/element-x-ios/issues/53 - Adopt MainActors, dispatch heavy operations do detached tasks and ensure combine publisher call back on the right queue

This commit is contained in:
Stefan Ceriu
2022-05-25 13:28:19 +03:00
committed by Stefan Ceriu
parent dde7786152
commit f5890b68a2
29 changed files with 100 additions and 90 deletions
@@ -46,33 +46,33 @@ struct MediaProvider: MediaProviderProtocol {
return .success(image)
}
return await withCheckedContinuation { continuation in
let cachedImageLoadResult = await withCheckedContinuation({ continuation in
imageCache.retrieveImage(forKey: source.underlyingSource.url()) { result in
if case let .success(cacheResult) = result,
let image = cacheResult.image {
continuation.resume(returning: .success(image))
return
continuation.resume(returning: result)
}
})
if case let .success(cacheResult) = cachedImageLoadResult,
let image = cacheResult.image {
return .success(image)
}
return await Task.detached { () -> Result<UIImage, MediaProviderError> in
do {
let imageData = try client.getMediaContent(source: source.underlyingSource)
guard let image = UIImage(data: Data(bytes: imageData, count: imageData.count)) else {
MXLog.error("Invalid image data")
return .failure(.invalidImageData)
}
processingQueue.async {
do {
let imageData = try client.getMediaContent(source: source.underlyingSource)
guard let image = UIImage(data: Data(bytes: imageData, count: imageData.count)) else {
MXLog.error("Invalid image data")
continuation.resume(returning: .failure(.invalidImageData))
return
}
imageCache.store(image, forKey: source.underlyingSource.url())
continuation.resume(returning: .success(image))
} catch {
MXLog.error("Failed retrieving image with error: \(error)")
continuation.resume(returning: .failure(.failedRetrievingImage))
}
}
imageCache.store(image, forKey: source.underlyingSource.url())
return .success(image)
} catch {
MXLog.error("Failed retrieving image with error: \(error)")
return .failure(.failedRetrievingImage)
}
}
}.value
}
}
@@ -14,6 +14,7 @@ enum MediaProviderError: Error {
case invalidImageData
}
@MainActor
protocol MediaProviderProtocol {
func imageFromSource(_ source: MediaSource?) -> UIImage?