12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- //
- // HashtagTimelineViewModel.swift
- // Mastodon
- //
- // Created by BradGao on 2021/3/30.
- //
- import os.log
- import UIKit
- import Combine
- import CoreData
- import CoreDataStack
- import GameplayKit
- import MastodonSDK
- import MastodonCore
- final class HashtagTimelineViewModel {
-
- let logger = Logger(subsystem: "HashtagTimelineViewModel", category: "ViewModel")
-
- let hashtag: String
-
- var disposeBag = Set<AnyCancellable>()
-
- var needLoadMiddleIndex: Int? = nil
-
- // input
- let context: AppContext
- let authContext: AuthContext
- let fetchedResultsController: StatusFetchedResultsController
- let isFetchingLatestTimeline = CurrentValueSubject<Bool, Never>(false)
- let timelinePredicate = CurrentValueSubject<NSPredicate?, Never>(nil)
- let hashtagEntity = CurrentValueSubject<Mastodon.Entity.Tag?, Never>(nil)
- let listBatchFetchViewModel = ListBatchFetchViewModel()
-
- // output
- var diffableDataSource: UITableViewDiffableDataSource<StatusSection, StatusItem>?
- let didLoadLatest = PassthroughSubject<Void, Never>()
- // bottom loader
- private(set) lazy var stateMachine: GKStateMachine = {
- // exclude timeline middle fetcher state
- let stateMachine = GKStateMachine(states: [
- State.Initial(viewModel: self),
- State.Reloading(viewModel: self),
- State.Fail(viewModel: self),
- State.Idle(viewModel: self),
- State.Loading(viewModel: self),
- State.NoMore(viewModel: self),
- ])
- stateMachine.enter(State.Initial.self)
- return stateMachine
- }()
-
- init(context: AppContext, authContext: AuthContext, hashtag: String) {
- self.context = context
- self.authContext = authContext
- self.hashtag = hashtag
- self.fetchedResultsController = StatusFetchedResultsController(
- managedObjectContext: context.managedObjectContext,
- domain: authContext.mastodonAuthenticationBox.domain,
- additionalTweetPredicate: nil
- )
- // end init
- }
-
- deinit {
- os_log(.info, log: .debug, "%{public}s[%{public}ld], %{public}s:", ((#file as NSString).lastPathComponent), #line, #function)
- }
-
- }
|