A simple use case with AVPlayer and RxSwift.
Imagine you have a tableView with audio tracks, when you click on a row the track will either play or pause the player.
There will be only one function named playItem available for the user and all other functionality will be private and handled with RxSwift.
So, let me present my implementation…
As you can see, all the properties are kept private, we have two RxSwift subjects, one for controlling the state and one for the player’s currentItem.
For RxSwift subject you can read this post: https://medium.com/@dimitriskalaitzidis/rxswift-subjects-a2c9ff32a185
On the init() I’m subscribing to observe the state, currentItem and player.status
Now on the viewController side
I’m creating a RxPlayerItem with title, artist and URL and then I’m using the playItem function in order to play/pause the RxPlayer.
This will call the RxPlayer playItem function and first will make a comparison of the item’s URL with the player’s currentItem asset URL.
If the URLs are the same the player’s state will change only from play/pause. If the URL is different, the currentItem will change.
I’m not using any play/pause logic on viewController and I don’t want that.
I just want to send a RxPlayerItem and the player must decide what to do with it.
This is not by any case a final implementation but a starting point to begin with.
You can get the code for RxPlayer.swift here: https://gist.github.com/dkalaitzidis/66c7a4b8e5a01b5738ead39f9b15203d