Skip to content

Instantly share code, notes, and snippets.

@xspyhack
Created November 20, 2018 07:37
Show Gist options
  • Save xspyhack/04ec210fe4cfde79dde27cb4dd76bb62 to your computer and use it in GitHub Desktop.
Save xspyhack/04ec210fe4cfde79dde27cb4dd76bb62 to your computer and use it in GitHub Desktop.
一种简单的控制播放器控制的方法
/// 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