Skip to content

Commit f452ab6

Browse files
authored
Merge pull request #4 from galbernator/steve/resolve-crash-in-dataTaskPublisher
Fix crash when using Combine
2 parents b1df666 + ad60d57 commit f452ab6

3 files changed

Lines changed: 12 additions & 21 deletions

File tree

Sources/ObservableNetworking/NetworkManager.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,8 @@ public final class NetworkManager: Network {
9797
return Fail(error: error).eraseToAnyPublisher()
9898
}
9999

100-
let taskPublisher: AnyPublisher<Data, NetworkError> = session.dataTaskPublisher(for: request as NSURLRequest)
101-
return taskPublisher
100+
return session.dataTaskPublisher(for: request as NSURLRequest)
102101
.mapError { .failure(message: $0.localizedDescription) }
103-
.flatMap(maxPublishers: .max(1)) { CurrentValueSubject<Data, NetworkError>($0) }
104102
.eraseToAnyPublisher()
105103
}
106104

Sources/ObservableNetworking/Protocols/Session.swift

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public protocol Session {
1414
func dataTask(with request: NSURLRequest, completionHandler: @escaping DataTaskResult) -> DataTask
1515

1616
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, macCatalyst 13.0, *)
17-
func dataTaskPublisher<T: TaskPublisher>(for request: NSURLRequest) -> T
17+
func dataTaskPublisher(for request: NSURLRequest) -> AnyPublisher<Data, NetworkError>
1818
}
1919

2020
// Make URLSession connform to Session protocol
@@ -24,8 +24,13 @@ extension URLSession: Session {
2424
}
2525

2626
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, macCatalyst 13.0, *)
27-
public func dataTaskPublisher<T: TaskPublisher>(for request: NSURLRequest) -> T {
28-
dataTaskPublisher(for: request as URLRequest) as! T
27+
public func dataTaskPublisher(for request: NSURLRequest) -> AnyPublisher<Data, NetworkError> {
28+
dataTaskPublisher(for: request as URLRequest)
29+
.mapError({ urlError -> NetworkError in
30+
NetworkError.failure(message: urlError.localizedDescription)
31+
})
32+
.flatMap(maxPublishers: .max(1)) { Just($0.data).setFailureType(to: NetworkError.self) }
33+
.eraseToAnyPublisher()
2934
}
3035
}
3136

@@ -36,15 +41,3 @@ public protocol DataTask {
3641

3742
// Make URLSessionDataTask conform to DataTask protocol
3843
extension URLSessionDataTask: DataTask {}
39-
40-
/// Protocol that allows dependecy injection for the express purpose of mocking `URLSession` during testing. This should not be used elsewhere
41-
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, macCatalyst 13.0, *)
42-
public protocol TaskPublisher: Publisher {}
43-
44-
// Make DataTaskPublisher conform to TaskPublisher protocol
45-
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, macCatalyst 13.0, *)
46-
extension URLSession.DataTaskPublisher: TaskPublisher {}
47-
48-
// Make AnyPublisher conform to TaskPublisher protocol
49-
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, macCatalyst 13.0, *)
50-
extension AnyPublisher: TaskPublisher {}

Tests/ObservableNetworkingTests/MockURLSession.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ class MockURLSession: Session {
4747
}
4848

4949
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, macCatalyst 13.0, *)
50-
func dataTaskPublisher<T>(for request: NSURLRequest) -> T where T : TaskPublisher {
50+
func dataTaskPublisher(for request: NSURLRequest) -> AnyPublisher<Data, NetworkError> {
5151
lastURL = request.url
52-
return MockDataTaskPublisher().eraseToAnyPublisher() as! T
52+
return MockDataTaskPublisher().eraseToAnyPublisher()
5353
}
5454

5555
private func createCookieHeader(for url: URL?) -> [String : String] {
@@ -78,7 +78,7 @@ class MockURLSessionDataTask: DataTask {
7878
}
7979
}
8080

81-
class MockDataTaskPublisher: TaskPublisher {
81+
class MockDataTaskPublisher: Publisher {
8282
typealias Output = Data
8383
typealias Failure = NetworkError
8484

0 commit comments

Comments
 (0)