Skip to content

Instantly share code, notes, and snippets.

@stleamist
Last active November 8, 2021 05:59
Show Gist options
  • Save stleamist/29e0c76b6e01fc38876478b7c622ff86 to your computer and use it in GitHub Desktop.
Save stleamist/29e0c76b6e01fc38876478b7c622ff86 to your computer and use it in GitHub Desktop.
import KingFisher
struct KFLinkPresentationIconProvider: ImageDataProvider {
let url: URL
let cacheKey: String
init(url: URL, cacheKey: String? = nil) {
self.url = url
self.cacheKey = cacheKey ?? url.absoluteString
}
func data(handler: @escaping (Result<Data, Error>) -> Void) {
LPMetadataProvider().startFetchingMetadata(for: url) { (metadata, metadataError) in
if let metadataError = metadataError {
return handler(.failure(metadataError))
}
metadata?.iconProvider?.loadObject(of: UIImage.self) { result in
switch result {
case .success(let icon):
handler(.success(icon.pngData()!))
case .failure(let error):
handler(.failure(error))
}
}
}
}
}
import Foundation
import Combine
extension NSItemProvider {
func loadObject<Object: NSItemProviderReading>(of type: Object.Type, completionHandler: @escaping (Result<Object, Error>) -> Void) {
self.loadObject(ofClass: type) { (object, error) in
if let error = error {
completionHandler(.failure(error))
} else if let object = object as? Object {
completionHandler(.success(object))
} else {
let error = NSError(domain: NSItemProvider.errorDomain, code: NSItemProvider.ErrorCode.unknownError.rawValue)
completionHandler(.failure(error))
}
}
}
func loadObjectPublisher<Object: NSItemProviderReading>(of type: Object.Type) -> AnyPublisher<Object, Error> {
let subject = PassthroughSubject<Object, Error>()
self.loadObject(of: type) { result in
switch result {
case .success(let object):
subject.send(object)
case .failure(let error):
subject.send(completion: .failure(error))
}
}
return subject.eraseToAnyPublisher()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment