Created
November 20, 2018 07:37
-
-
Save xspyhack/04ec210fe4cfde79dde27cb4dd76bb62 to your computer and use it in GitHub Desktop.
一种简单的控制播放器控制的方法
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// Queue player | |
struct Player { | |
/// The player status | |
/// | |
/// - idle: before play | |
/// - waiting: means it is waiting for loading asset | |
/// - playing: now playing | |
/// - paused: paused | |
/// - stopped: end play | |
enum Status { | |
case idl | |
case waiting | |
case playing | |
case paused | |
case stopped | |
} | |
enum Flag { | |
/// keyboard showing | |
case keyboard | |
/// app inactive | |
case inactive | |
/// view disappear | |
case disappear | |
/// user action | |
case action | |
/// picker showing | |
case picker | |
/// holding | |
case holding | |
/// fetching data | |
case fetching | |
/// exporting asset (id) | |
case exporting(String) | |
} | |
struct Barrier { | |
/// all flags | |
var flags: Set<Flag> = [] | |
/// current supported flags | |
static let enabledFlags: Set<Flag> = [.keyboard, .inactive, .disappear, .action, .picker, .holding] | |
} | |
/// player barrier | |
private var barrier = Barrier() | |
/// player status | |
private var status: Status = .idle | |
/// current index | |
private var currentIndex: Int | |
} | |
extension Player.Flag: Hashable { | |
} | |
extension Player { | |
/// Player try to become active with flag | |
/// | |
/// - Parameter flag: leave flag | |
func becomeActive(flag: Flag) { | |
barrier.flags.remove(flag) | |
guard Barrier.enabledFlags.intersection(barrier.flags).isEmpty else { | |
return | |
} | |
switch status { | |
case .paused: | |
resume() | |
case .idle, .waiting, .stopped: | |
tryPlay(at: currentIndex) | |
case .playing: | |
break | |
} | |
} | |
/// Player resign active with flag | |
/// | |
/// - Parameter flag: enter flag | |
func resignActive(flag: Flag) { | |
barrier.flags.insert(flag) | |
switch status { | |
case .playing: | |
pause() | |
default: | |
break | |
} | |
} | |
/// Add a flag,without update status (enter) | |
/// | |
/// - Parameter flag: the flag | |
func add(flag: Flag) { | |
barrier.flags.insert(flag) | |
} | |
/// Remove a flag,without update status (leave) | |
/// | |
/// - Parameter flag: the flag | |
func remove(flag: Flag) { | |
barrier.flags.remove(flag) | |
} | |
// MAKR: play control | |
private func tryPlay(at index: Int) { | |
... | |
play() | |
} | |
private func play() { | |
} | |
private func pause() { | |
} | |
private func resume() { | |
} | |
private func stop() { | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment