// // SoundsViewModel.swift // Bark // // Created by huangfeng on 2020/11/17. // Copyright © 2020 Fin. All rights reserved. // import AVKit import Foundation import RxCocoa import RxDataSources import RxSwift class SoundsViewModel: ViewModel, ViewModelType { struct Input { var soundSelected: Driver } struct Output { var audios: Observable<[SectionModel]> var copyNameAction: Driver var playAction: Driver } func transform(input: Input) -> Output { let models = { () -> [AVURLAsset] in var urls = Bundle.main.urls(forResourcesWithExtension: "caf", subdirectory: nil) ?? [] urls.sort { u1, u2 -> Bool in u1.lastPathComponent.localizedStandardCompare(u2.lastPathComponent) == ComparisonResult.orderedAscending } let audios = urls.map { url -> AVURLAsset in let asset = AVURLAsset(url: url) return asset } return audios }().map { SoundCellViewModel(model: $0) } let copyAction = Driver.merge( models.map { $0.copyNameAction.asDriver(onErrorDriveWith: .empty()) } ).asDriver() return Output( audios: Observable.just([SectionModel(model: "model", items: models)]), copyNameAction: copyAction, playAction: input.soundSelected.map { $0.model.url as CFURL } ) } }