Skip to content

Instantly share code, notes, and snippets.

@erdemildiz
Created October 25, 2020 09:04
Show Gist options
  • Save erdemildiz/4729d4cec9ab178e8c3f9e75844fdbcd to your computer and use it in GitHub Desktop.
Save erdemildiz/4729d4cec9ab178e8c3f9e75844fdbcd to your computer and use it in GitHub Desktop.
Publisher extension - asResult
// Source: https://www.swiftbysundell.com/articles/the-power-of-extensions-in-swift/
extension Publisher {
func asResult() -> AnyPublisher<Result<Output, Failure>, Never> {
self.map(Result.success)
.catch { error in
Just(.failure(error))
}
.eraseToAnyPublisher()
}
}
@erdemildiz
Copy link
Author

Usage

class AsyncValue<Value: Decodable>: ObservableObject {
    @Published private(set) var result: Result<Value, Error>?
    private var cancellable: AnyCancellable?

    func load(from url: URL,
              using session: URLSession = .shared,
              decoder: JSONDecoder = .init()) {
        cancellable = session.dataTaskPublisher(for: url)
            .map(\.data)
            .decode(type: Value.self, decoder: decoder)
            .asResult()
            .sink { [weak self] result in
                self?.result = result
            }
    }
} 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment