                 .start(on: QueueScheduler())
         }
     
-        let loadings = fetchAction.isExecuting.signal.filter({ $0 }).map({ _ in PageViewData.loading })
-        let errors = fetchAction.errors.map { PageViewData.failed($0) }
-        let values = fetchAction.values.map { $0.liveVideos.count == 0 ? PageViewData.empty : PageViewData.loaded($0.liveVideos) }
+        let loadings = fetchAction.isExecuting.signal.filter({ $0 }).map({ _ in ViewData.loading })
+        let errors = fetchAction.errors.map { ViewData.failed($0) }
+        let values = fetchAction.values.map { $0.liveVideos.count == 0 ? ViewData.empty : ViewData.loaded($0.liveVideos) }
         let merged = SignalProducer([loadings, errors, values]).flatten(.merge)
         self.viewData = ReactiveSwift.Property(initial: .unloaded, then: merged)
         


final class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
    
    let channelId: String
    let sessionConfig: SessionConfig
    let client: XCDYouTubeClient
    
    let viewData: Property<PageViewData>
    let userPlayState = MutableProperty(UserPlayState.play)
    
    let fetchAction: Action<(), LiveVideosSearchResult, NSError>

        viewData.producer
            // TODO: isEqual
            .observe(on: UIScheduler())
            .startWithValues { [weak self] (viewData: ViewData) in
                switch viewData {
                case .unloaded:
                    break
