mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 06:55:59 +00:00
Address the real lifetime issue of the SDK's Client by making Context.mediaProvider weak. (#4466)
This reverts commit 927aea4bfe.
This commit is contained in:
@@ -16,17 +16,7 @@ private final class MediaRequest {
|
||||
}
|
||||
|
||||
actor MediaLoader: MediaLoaderProtocol {
|
||||
// Something is holding onto our MediaProvider (and therefore this MediaLoader) which means
|
||||
// when attempting to clear the caches, the SDK's Client hangs around and we end up with 2.
|
||||
// I have spent a long time trying to understand what's going on – there's instances of both
|
||||
// TimelineViewModel.Context and ComposerToolbarViewModel.Context still hanging around and
|
||||
// a closure captures the media provider from both of those as far as I can tell, but I was
|
||||
// unable to break the reference. Possibly related to the ElementTextView too.
|
||||
//
|
||||
// In lieu of the real fix, lets use a weak reference to the Client here so that it can be
|
||||
// released and hopefully that will solve our logs files exploding in size when encountering
|
||||
// a corrupt/missing database file.
|
||||
private weak var client: ClientProtocol?
|
||||
private let client: ClientProtocol
|
||||
private var ongoingRequests = [MediaSourceProxy: MediaRequest]()
|
||||
|
||||
init(client: ClientProtocol) {
|
||||
@@ -34,21 +24,18 @@ actor MediaLoader: MediaLoaderProtocol {
|
||||
}
|
||||
|
||||
func loadMediaContentForSource(_ source: MediaSourceProxy) async throws -> Data {
|
||||
try await enqueueLoadMediaRequest(forSource: source) { [weak client] in
|
||||
guard let client else { throw MediaLoaderError.missingClient }
|
||||
return try await client.getMediaContent(mediaSource: source.underlyingSource)
|
||||
try await enqueueLoadMediaRequest(forSource: source) {
|
||||
try await self.client.getMediaContent(mediaSource: source.underlyingSource)
|
||||
}
|
||||
}
|
||||
|
||||
func loadMediaThumbnailForSource(_ source: MediaSourceProxy, width: UInt, height: UInt) async throws -> Data {
|
||||
try await enqueueLoadMediaRequest(forSource: source) { [weak client] in
|
||||
guard let client else { throw MediaLoaderError.missingClient }
|
||||
return try await client.getMediaThumbnail(mediaSource: source.underlyingSource, width: UInt64(width), height: UInt64(height))
|
||||
try await enqueueLoadMediaRequest(forSource: source) {
|
||||
try await self.client.getMediaThumbnail(mediaSource: source.underlyingSource, width: UInt64(width), height: UInt64(height))
|
||||
}
|
||||
}
|
||||
|
||||
func loadMediaFileForSource(_ source: MediaSourceProxy, filename: String?) async throws -> MediaFileHandleProxy {
|
||||
guard let client else { throw MediaLoaderError.missingClient }
|
||||
let result = try await client.getMediaFile(mediaSource: source.underlyingSource,
|
||||
filename: filename,
|
||||
mimeType: source.mimeType ?? "application/octet-stream",
|
||||
|
||||
@@ -7,10 +7,6 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
enum MediaLoaderError: Error {
|
||||
case missingClient
|
||||
}
|
||||
|
||||
// sourcery: AutoMockable
|
||||
protocol MediaLoaderProtocol {
|
||||
func loadMediaContentForSource(_ source: MediaSourceProxy) async throws -> Data
|
||||
|
||||
@@ -9,7 +9,7 @@ import Combine
|
||||
import Kingfisher
|
||||
import UIKit
|
||||
|
||||
struct MediaProvider: MediaProviderProtocol {
|
||||
class MediaProvider: MediaProviderProtocol {
|
||||
private let mediaLoader: MediaLoaderProtocol
|
||||
private let imageCache: Kingfisher.ImageCache
|
||||
private let networkMonitor: NetworkMonitorProtocol?
|
||||
|
||||
@@ -17,7 +17,7 @@ enum MediaProviderError: Error {
|
||||
}
|
||||
|
||||
// sourcery: AutoMockable
|
||||
protocol MediaProviderProtocol {
|
||||
protocol MediaProviderProtocol: AnyObject {
|
||||
func imageFromSource(_ source: MediaSourceProxy?, size: CGSize?) -> UIImage?
|
||||
func loadImageFromSource(_ source: MediaSourceProxy, size: CGSize?) async -> Result<UIImage, MediaProviderError>
|
||||
func loadImageDataFromSource(_ source: MediaSourceProxy) async -> Result<Data, MediaProviderError>
|
||||
|
||||
Reference in New Issue
Block a user