- Proposal: SE-NNNN
- Authors: Giuseppe Lanza
- Review Manager: TBD
- Status: Awaiting review
A closure is said to escape a function when the closure is passed as an argument
A closure is said to escape a function when the closure is passed as an argument
class MyModule: NSObject, EventsProducer { | |
... | |
public var events: Observable<ProductDetailPageEvent> | |
... | |
} | |
let producer = MyModule(usingContext: ...) | |
//you can use EventsProucer subscript | |
producer[event: ProductDetailPageEvent.didAddToCart] //didAddToCart has a BagProductProtocol in the payload |
@UIApplicationMain | |
class AppDelegate: UIResponder, UIApplicationDelegate { | |
var window: UIWindow? | |
var moduleManager: BaseModuleManager = BaseModuleManager() | |
var router: SimpleRouter! | |
lazy var eventsListeners: [AnyEventsListening] = { | |
[ | |
ConsoleLogEventsListener(), |
extension UIStoryboard { | |
static var restaurantsList: UIStoryboard { | |
return UIStoryboard(name: "RestaurantsList", bundle: Bundle(for: RestaurantsListModule.self)) | |
} | |
} | |
public class RestaurantsListModule: NSObject, ModuleProtocol, EventsProducer, PageRepresenting { | |
public var context: ModuleContext | |
public var pageName: String = "Restaurants List" |
//This events listener is interested in any event from any producer | |
//The purpose of this listener is to log the event with a print | |
class EventsLogger: AnyEventsListening { | |
@discardableResult func registerToEvents(for producer: AnyEventsProducer) -> Bool { | |
producer.anyEvent | |
.map { String(describing: $0) } | |
.subscribe(onNext: { print($0) }) | |
.disposed(by: producer.disposeBag) | |
return true | |
} |
class SimpleRouter: Router { | |
var viewControllersFactory: ViewControllersFactory? | |
required init(withFactory factory: ViewControllersFactory) { | |
viewControllersFactory = factory | |
} | |
var topViewController: UIViewController { return rootNavigationController } | |
private lazy var rootNavigationController: UINavigationController = { | |
let presentableStep = PresentableRoutingStep(withStep: .restaurantsList(), presentationMode: .none) |
public enum ProductDetailPageEvent: EventProtocol { | |
case productLoaded(FullProductProtocol) | |
case didAddToCart(BagProductProtocol) | |
case didAddProductToWaitlist(FullProductProtocol) | |
case didShareProduct(MinimumProductProtocol) | |
case didChangeSize(newSize: ProductSizeProtocol) | |
case didChangeColor(newColor: ProductColorProtocol) | |
} |