Skip to content

Commit 9429ff0

Browse files
author
Christian Elies
committed
feat(): implemented support for a custom RemoteImageURLDataPublisher
1 parent 02efeea commit 9429ff0

File tree

7 files changed

+25
-24
lines changed

7 files changed

+25
-24
lines changed

Sources/RemoteImage/private/Protocols/RemoteImageURLDataPublisher.swift

Lines changed: 0 additions & 13 deletions
This file was deleted.

Sources/RemoteImage/private/Services/RemoteImageServiceDependencies.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ struct RemoteImageServiceDependencies: RemoteImageServiceDependenciesProtocol {
1515
let photoKitService: PhotoKitServiceProtocol
1616
let remoteImageURLDataPublisher: RemoteImageURLDataPublisher
1717

18-
init() {
18+
init(remoteImageURLDataPublisher: RemoteImageURLDataPublisher) {
1919
photoKitService = PhotoKitService()
20-
remoteImageURLDataPublisher = URLSession.shared
20+
self.remoteImageURLDataPublisher = remoteImageURLDataPublisher
2121
}
2222
}

Sources/RemoteImage/private/Extensions/URLSession+RemoteImageURLDataPublisher.swift renamed to Sources/RemoteImage/public/Extensions/URLSession+RemoteImageURLDataPublisher.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Combine
99
import Foundation
1010

1111
extension URLSession: RemoteImageURLDataPublisher {
12-
func dataPublisher(for request: URLRequest) -> AnyPublisher<(data: Data, response: URLResponse), URLError> {
13-
dataTaskPublisher(for: request).eraseToAnyPublisher()
12+
public func dataPublisher(for url: URL) -> AnyPublisher<(data: Data, response: URLResponse), URLError> {
13+
dataTaskPublisher(for: url).eraseToAnyPublisher()
1414
}
1515
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// RemoteImageURLDataPublisher.swift
3+
// RemoteImage
4+
//
5+
// Created by Christian Elies on 15.12.19.
6+
//
7+
8+
import Combine
9+
import Foundation
10+
11+
public protocol RemoteImageURLDataPublisher {
12+
func dataPublisher(for url: URL) -> AnyPublisher<(data: Data, response: URLResponse), URLError>
13+
}

Sources/RemoteImage/public/Services/RemoteImageService.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ private extension RemoteImageService {
4949
return
5050
}
5151

52-
let urlRequest = URLRequest(url: url)
53-
54-
cancellable = dependencies.remoteImageURLDataPublisher.dataPublisher(for: urlRequest)
52+
cancellable = dependencies.remoteImageURLDataPublisher.dataPublisher(for: url)
5553
.map { UniversalImage(data: $0.data) }
5654
.receive(on: RunLoop.main)
5755
.sink(receiveCompletion: { [weak self] completion in

Sources/RemoteImage/public/Services/RemoteImageServiceFactory.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
//
77

88
public final class RemoteImageServiceFactory {
9-
public static func makeRemoteImageService() -> RemoteImageService {
10-
let dependencies = RemoteImageServiceDependencies()
9+
public static func makeRemoteImageService(remoteImageURLDataPublisher: RemoteImageURLDataPublisher) -> RemoteImageService {
10+
let dependencies = RemoteImageServiceDependencies(remoteImageURLDataPublisher: remoteImageURLDataPublisher)
1111
return RemoteImageService(dependencies: dependencies)
1212
}
1313
}

Sources/RemoteImage/public/Views/RemoteImage.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public struct RemoteImage<ErrorView: View, ImageView: View, LoadingView: View>:
1616
private let imageView: (Image) -> ImageView
1717
private let loadingView: () -> LoadingView
1818

19-
@ObservedObject private var service = RemoteImageServiceFactory.makeRemoteImageService()
19+
@ObservedObject private var service: RemoteImageService
2020

2121
public var body: some View {
2222
switch service.state {
@@ -33,12 +33,15 @@ public struct RemoteImage<ErrorView: View, ImageView: View, LoadingView: View>:
3333
}
3434
}
3535

36-
public init(type: RemoteImageType, @ViewBuilder errorView: @escaping (Error) -> ErrorView, @ViewBuilder imageView: @escaping (Image) -> ImageView, @ViewBuilder loadingView: @escaping () -> LoadingView) {
36+
public init(type: RemoteImageType, remoteImageURLDataPublisher: RemoteImageURLDataPublisher = URLSession.shared, @ViewBuilder errorView: @escaping (Error) -> ErrorView, @ViewBuilder imageView: @escaping (Image) -> ImageView, @ViewBuilder loadingView: @escaping () -> LoadingView) {
3737
self.type = type
3838
self.errorView = errorView
3939
self.imageView = imageView
4040
self.loadingView = loadingView
4141

42+
let service = RemoteImageServiceFactory.makeRemoteImageService(remoteImageURLDataPublisher: remoteImageURLDataPublisher)
43+
_service = ObservedObject(wrappedValue: service)
44+
4245
service.fetchImage(ofType: type)
4346
}
4447
}

0 commit comments

Comments
 (0)