Skip to content

Instantly share code, notes, and snippets.

@mrfarukturgut
Last active February 17, 2021 07:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrfarukturgut/34a0b7d59ec66298f9d081b009b74a79 to your computer and use it in GitHub Desktop.
Save mrfarukturgut/34a0b7d59ec66298f9d081b009b74a79 to your computer and use it in GitHub Desktop.
Plain publisher
import UIKit
struct Books: Codable {}
struct Movies: Codable {}
// MARK: - Observer
protocol BooksObserver {
func received(_ data: Books)
//func subscribe(toService service: BooksService)
}
extension BooksObserver {
func subscribe(toService service: BooksService) {
service.add(self)
}
}
protocol MoviesObserver {
func received(_ data: Movies)
//func subscribe(toService service: MoviesService)
}
extension MoviesObserver {
func subscribe(toService service: MoviesService) {
service.add(self)
}
}
// MARK: - Service
class BooksService {
var data: Books?
//var observers: [BooksObserver] = .init()
func publish() {
print()
//observers.forEach({ $0.received(data!)} )
}
func add(_ observer: BooksObserver) {
//observers.append(observer)
}
}
class MoviesService {
var data: Movies?
//var observers: [MoviesObserver] = .init()
func publish() {
//observers.forEach({ $0.received(data!)} )
}
func add(_ observer: MoviesObserver) {
//observers.append(observer)
}
}
// MARK: - Controllers
class ViewController: UIViewController {
let bookService = BooksService()
let movieService = MoviesService()
override func viewDidLoad() {
super.viewDidLoad()
subscribe(toService: bookService)
subscribe(toService: movieService)
}
}
extension ViewController: BooksObserver {
func received(_ data: Books) {
print(data)
}
}
extension ViewController: MoviesObserver {
func received(_ data: Movies) {
print(data)
}
}
///
/// A possible solution came to my mind.
///
/// Class in between publishers and observers, taking capability of publishing and information what are observers away from publisher.
///
class Coordinator {
private var bookObservers: [BooksObserver] = .init()
private var movieObservers: [MoviesObserver] = .init()
// will be called from observers - viewControllers
func add(_ observer: UIViewController) {
if let observer = observer as? BooksObserver { bookObservers.append(observer) }
if let observer = observer as? MoviesObserver { movieObservers.append(observer) }
}
// will be called from publishers
func publish(_ data: Codable) {
if let data = data as? Books { bookObservers.forEach({ $0.received(data)} )}
if let data = data as? Movies { movieObservers.forEach({ $0.received(data)} )}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment