                 }
         }
         
+        /// When new values are vended by fetchUserViewModelsAction, update userViewModels on viewModelsQueue.
         fetchUserViewModelsAction.values
             .observeOn(viewModelsQueue)
             .observeNext { [unowned self] userViewModels in

            }
    }
    
    func fetchUserViewModels() {
        fetchUserViewModelsAction.apply().start()
    }
    
    func activateIndexPath(indexPath: NSIndexPath) {
        guard let userViewModel = userViewModels?[indexPath.row] else { return }
        if userViewModel.shouldFetchAvatarImage() {
            self.loadUserViewModelImageProducer(userViewModel).start()
        }
    }
    
    private func loadUserViewModelImageProducer(userViewModel: UserViewModel) -> SignalProducer<(UserViewModel, [UserViewModel], [NSIndexPath]), NoError> {
        return SignalProducer<UserViewModel, NoError>(value: userViewModel)
            .observeOn(workQueue)
            .flatMap(FlattenStrategy.Latest, transform: self.loadingImageUserViewModelImageProducer)
            .observeOn(viewModelsQueue)
            .flatMap(.Latest, transform: { [unowned self] viewModel -> SignalProducer<(UserViewModel, [UserViewModel], [NSIndexPath]), NoError> in
                guard let userViewModels = self.userViewModels else { return .empty }
                return self.replaceUserViewModelProducer(viewModel, userViewModels: userViewModels)
            })
            .on(next: { [unowned self] (userViewModel, userViewModels, changedIndexPaths) in
                self.userViewModels = userViewModels
                self.reloadIndexPathsObserver.sendNext(changedIndexPaths)
            })
            .observeOn(imageQueue)
            .map { (viewModel: UserViewModel, _, _) in return viewModel }
            .flatMap(.Latest, transform: self.fetchUserViewModelImageProducer)
            .observeOn(viewModelsQueue)
            .flatMap(.Latest, transform: { [unowned self] (viewModel: UserViewModel) -> SignalProducer<(UserViewModel, [UserViewModel], [NSIndexPath]), NoError> in
                guard let userViewModels = self.userViewModels else { return .empty }
                return self.replaceUserViewModelProducer(viewModel, userViewModels: userViewModels)
            })

        (reloadIndexPathsSignal, reloadIndexPathsObserver) = Signal<[NSIndexPath], NoError>.pipe()
        
        fetchUserViewModelsAction = Action { [unowned workQueue] _ in
            /// Fetch 100 User objects on workQueue, then transform them into UserViewModels with empty images.
            return SignalProducer(value: 100)
                .observeOn(workQueue)
                .flatMap(.Latest, transform: userController.fetchRandomUsersProducer)
