diff --git a/Example/MonarchRouterExample/Presenters.swift b/Example/MonarchRouterExample/Presenters.swift index 0643553..793628a 100644 --- a/Example/MonarchRouterExample/Presenters.swift +++ b/Example/MonarchRouterExample/Presenters.swift @@ -167,5 +167,5 @@ func lazyNavigationRoutePresenter() -> RoutePresenterStack func lazyPresenter(for endpoint: EndpointViewControllerId, router: ProvidesRouteDispatch) -> RoutePresenter { - return RoutePresenter.lazyPresenter(buildEndpoint(endpoint, router: router)) + return RoutePresenter.lazyPresenter(wrap: buildEndpoint(endpoint, router: router)) } diff --git a/MonarchRouter.podspec b/MonarchRouter.podspec index 753d770..9e4710f 100644 --- a/MonarchRouter.podspec +++ b/MonarchRouter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'MonarchRouter' - s.version = '1.0.1' + s.version = '1.0.2' s.summary = 'A lightweight yet powerful state-based router written in Swift.' s.description = <<-DESC diff --git a/Source/Presenter.swift b/Source/Presenter.swift index 19dca57..9adcdde 100644 --- a/Source/Presenter.swift +++ b/Source/Presenter.swift @@ -110,7 +110,38 @@ public struct RoutePresenter: RoutePresenterType, RoutePresenterCapableOfModalsP /// - parameter unwind: Optional callback executed when the Presentable is no longer presented. /// - returns: RoutePresenter public static func lazyPresenter( - _ getPresentable: @escaping @autoclosure () -> (UIViewController), + _ getPresentable: @escaping () -> (UIViewController), + setParameters: ((_ parameters: RouteParameters, _ presentable: UIViewController) -> ())? = nil, + presentModal: ((_ modal: UIViewController, _ over: UIViewController) -> ())? = nil, + dismissModal: ((_ modal: UIViewController)->())? = nil, + unwind: ((_ presentable: UIViewController) -> ())? = nil + ) -> RoutePresenter + { + weak var presentable: UIViewController? = nil + + let maybeCachedPresentable: () -> (UIViewController) = { + if let cachedPresentable = presentable { + return cachedPresentable + } + + let newPresentable = getPresentable() + presentable = newPresentable + return newPresentable + } + let presenter = RoutePresenter(getPresentable: maybeCachedPresentable, setParameters: setParameters, presentModal: presentModal, dismissModal: dismissModal, unwind: unwind) + + return presenter + } + + /// An autoclosure lazy wrapper around a Presenter creation function that wraps presenter scope, but the Presentable does not get created until invoked. + /// - parameter getPresentable: Autoclosure returning a Presentable object. + /// - parameter setParameters: Optional callback to configure a Presentable with given `RouteParameters`. Don't set if the Presentable conforms to `RouteParametrizedPresentable`. + /// - parameter presentModal: Optional callback to define modals presentation. Default behaviour if undefined. + /// - parameter dismissModal: Optional callback to define modals dismissal. Default behaviour if undefined. + /// - parameter unwind: Optional callback executed when the Presentable is no longer presented. + /// - returns: RoutePresenter + public static func lazyPresenter( + wrap getPresentable: @escaping @autoclosure () -> (UIViewController), setParameters: ((_ parameters: RouteParameters, _ presentable: UIViewController) -> ())? = nil, presentModal: ((_ modal: UIViewController, _ over: UIViewController) -> ())? = nil, dismissModal: ((_ modal: UIViewController)->())? = nil,