调整 HomeViewModel

This commit is contained in:
Fin 2020-11-28 19:40:23 +08:00
parent 614ca382ef
commit 4513784484
3 changed files with 95 additions and 53 deletions

View File

@ -8,6 +8,9 @@
import UIKit
import UserNotifications
import RxSwift
import RxCocoa
class Client: NSObject {
static let shared = Client()
private override init() {
@ -51,33 +54,33 @@ class Client: NSObject {
case serverError
}
var state = ClienState.ok {
didSet{
NotificationCenter.default.post(name: Notification.Name(rawValue: "ClientStateChangeds"), object: nil)
}
}
var state = BehaviorRelay<ClienState>(value: .ok)
var dispose:Disposable?
func bindDeviceToken(){
if let token = Settings[.deviceToken] , token.count > 0{
BarkApi.provider
dispose?.dispose()
dispose = BarkApi.provider
.request(.register(
key: key,
devicetoken: token))
.filterResponseError()
.subscribe(onNext: { (json) in
.map { (json) -> ClienState in
switch json {
case .success(let json):
if let key = json["data","key"].rawString() {
Client.shared.key = key
self.state = .ok
return .ok
}
else{
self.state = .serverError
return .serverError
}
case .failure:
self.state = .serverError
return .serverError
}
}).disposed(by: rx.disposeBag)
}
.bind(to: state)
}
}

View File

@ -77,7 +77,8 @@ class HomeViewController: BaseViewController {
viewDidAppear: self.rx.methodInvoked(#selector(viewDidAppear(_:)))
.map{ _ in () }
.asDriver(onErrorDriveWith: .empty()),
start: self.startButton.rx.tap.asDriver()
start: self.startButton.rx.tap.asDriver(),
clientState: Client.shared.state.asDriver()
)
)
@ -89,23 +90,29 @@ class HomeViewController: BaseViewController {
return UITableViewCell()
}
//
output.title
.drive(self.navigationItem.rx.title)
.disposed(by: rx.disposeBag)
//TableView
output.previews
.drive(self.tableView.rx.items(dataSource: dataSource))
.disposed(by: rx.disposeBag)
output.push.drive(onNext: {[weak self] viewModel in
self?.pushViewModel(viewModel: viewModel)
}).disposed(by: rx.disposeBag)
//
output.push
.drive(onNext: {[weak self] viewModel in
self?.pushViewModel(viewModel: viewModel)
})
.disposed(by: rx.disposeBag)
output.clienState.drive(onNext: {[weak self] state in
Client.shared.state = state
self?.refreshState()
}).disposed(by: rx.disposeBag)
//ping clienState
output.clienStateChanged
.drive(Client.shared.state)
.disposed(by: rx.disposeBag)
//
output.tableViewHidden
.map{ !$0 }
.drive(self.tableView.rx.isHidden)
@ -114,26 +121,39 @@ class HomeViewController: BaseViewController {
.drive(self.startButton.rx.isHidden)
.disposed(by: rx.disposeBag)
//
output.showSnackbar
.drive(onNext: {[weak self] text in
self?.showSnackbar(text: text)
})
.disposed(by: rx.disposeBag)
//startButton
output.startButtonEnable
.drive(self.startButton.rx.isEnabled)
.disposed(by: rx.disposeBag)
output.copy.drive(onNext: {[weak self] text in
UIPasteboard.general.string = text
self?.showSnackbar(text: NSLocalizedString("Copy"))
})
.disposed(by: rx.disposeBag)
//
output.copy
.drive(onNext: {[weak self] text in
UIPasteboard.general.string = text
self?.showSnackbar(text: NSLocalizedString("Copy"))
})
.disposed(by: rx.disposeBag)
output.preview.drive(onNext: { url in
UIApplication.shared.open(url, options: [:], completionHandler: nil)
})
.disposed(by: rx.disposeBag)
//
output.preview
.drive(onNext: { url in
UIApplication.shared.open(url, options: [:], completionHandler: nil)
})
.disposed(by: rx.disposeBag)
// TableView
output.reloadData
.drive(onNext: {[weak self] in
self?.tableView.reloadData()
})
.disposed(by: rx.disposeBag)
}
@ -155,20 +175,3 @@ class HomeViewController: BaseViewController {
}
}
extension HomeViewController {
@objc func refreshState() {
switch Client.shared.state {
case .ok:
if let url = URL(string: ServerManager.shared.currentAddress) {
if url.scheme?.lowercased() != "https" {
self.showSnackbar(text: NSLocalizedString("InsecureConnection"))
}
self.tableView.reloadData()
}
case .serverError:
self.showSnackbar(text: NSLocalizedString("ServerError"))
default: break;
}
}
}

View File

@ -15,21 +15,23 @@ import UserNotifications
class HomeViewModel: ViewModel, ViewModelType {
struct Input {
let addCustomServerTap:Driver<Void>
let historyMessageTap:Driver<Void>
let viewDidAppear:Driver<Void>
let start:Driver<Void>
let addCustomServerTap: Driver<Void>
let historyMessageTap: Driver<Void>
let viewDidAppear: Driver<Void>
let start: Driver<Void>
let clientState: Driver<Client.ClienState>
}
struct Output {
let previews: Driver<[SectionModel<String,PreviewCardCellViewModel>]>
let push: Driver<ViewModel>
let title:Driver<String>
let clienState: Driver<Client.ClienState>
let title: Driver<String>
let clienStateChanged: Driver<Client.ClienState>
let tableViewHidden: Driver<Bool>
let showSnackbar: Driver<String>
let startButtonEnable: Driver<Bool>
let copy: Driver<String>
let preview: Driver<URL>
let reloadData: Driver<Void>
}
let previews:[PreviewModel] = {
@ -72,6 +74,8 @@ class HomeViewModel: ViewModel, ViewModelType {
]
}()
var currentState = Client.ClienState.ok
func transform(input: Input) -> Output {
let sectionModel = SectionModel(
model: "previews",
@ -143,16 +147,48 @@ class HomeViewModel: ViewModel, ViewModelType {
.bind(to: showSnackbar)
.disposed(by: rx.disposeBag)
//client state
input.clientState.drive(onNext: { state in
switch state {
case .ok:
if let url = URL(string: ServerManager.shared.currentAddress) {
if url.scheme?.lowercased() != "https" {
showSnackbar.accept(NSLocalizedString("InsecureConnection"))
}
}
case .serverError:
showSnackbar.accept(NSLocalizedString("ServerError"))
default: break;
}
})
.disposed(by: rx.disposeBag)
//reloadData
let reloadData = input.clientState.filter {[weak self] (state) -> Bool in
if let strongSelf = self {
if state != strongSelf.currentState {
strongSelf.currentState = state
return true
}
}
return false
}
.map { _ in
()
}
return Output(
previews:Driver.just([sectionModel]),
push: Driver<ViewModel>.merge(customServer,messageHistory,noticeTap),
title: Driver.of(URL(string: ServerManager.shared.currentAddress)?.host ?? ""),
clienState: clienState.asDriver(onErrorDriveWith: .empty()),
clienStateChanged: clienState.asDriver(onErrorDriveWith: .empty()),
tableViewHidden: tableViewHidden,
showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty()),
startButtonEnable: Driver.just(true),
copy: Driver.merge(sectionModel.items.map{ $0.copy.asDriver(onErrorDriveWith: .empty()) }),
preview: Driver.merge(sectionModel.items.map{ $0.preview.asDriver(onErrorDriveWith: .empty()) })
preview: Driver.merge(sectionModel.items.map{ $0.preview.asDriver(onErrorDriveWith: .empty()) }),
reloadData: reloadData
)
}