前言
贝乐虎的视频播放已经完成了,下面我们就开始做听故事(音频播放),不过这个只能播放一小部分,因为获取音频播放的url需要签名,不知道其签名规则,所以只能播放那些不需要签名的。
故事列表
1、新建一个RecAudioListViewController
,暴露三个属性
var atype: String = ""
var id: String = ""
var outerid: String = ""
2、上面的介绍是固定在导航栏下面的,新建一个RecAudioHeaderView
,然后再RecAudioListViewController
里面初始化
private lazy var headerView: RecAudioHeaderView = {
RecAudioHeaderView()
}()
3、下面就是tableView
private lazy var tableView: UITableView = {
let view = UITableView(frame: .zero, style: .plain)
view.separator(left: space, right: 0)
view.plainFooterView()
view.rowHeight = 55.fit
view.delegate = self
view.dataSource = self
view.register(cellWithClass: RecAudioListCell.self)
return view
}()
extension RecAudioListViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withClass: RecAudioListCell.self)
cell.countLabel.text = "\(indexPath.row + 1)"
cell.update(dataSource[indexPath.row])
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = AudioPlayerViewController.share
vc.atype = atype
vc.audioModel = audioModel
vc.dataSource = dataSource
vc.playerIndex = indexPath.row
vc.didAudioItemModeChange = { [weak self] in
guard let `self` = self else { return }
self.refreshSeletedData()
}
vc.playerURL()
push(vc)
}
}
4、请求数据
extension RecAudioListViewController {
/// 如果atype是2的话,只需要请求这一个接口,如果是其他的话还要请求下面的
private func requestData() {
Network.Rec
.audioAlbum(id: id, page: page)
.request()
.responseData(AudioModel.self) { [weak self] (model) in
guard let `self` = self else { return }
/// 结束mj footer刷新
self.tableView.endFooterRefresh()
/// 更新详情信息
self.headerView.update(model.result.album)
self.audioModel = model.result
if self.atype == "2" {
if self.tableView.isHeaderRefresh {
self.dataSource.removeAll()
}
self.tableView.endHeaderRefresh()
self.dataSource.append(contentsOf: model.result.items)
self.refreshSeletedData()
}
} failure: { [weak self] (error) in
guard let `self` = self else { return }
self.tableView.endHeaderRefresh()
self.tableView.endFooterRefresh()
Toast.show(info: error.errorMessage)
}
}
/// 如果atype不等于2的话,用这个接口来请求列表数据
private func requestAudioList() {
Network.Rec
.audioList(id: outerid, page: page)
.request()
.responseAudioData([AudioItemModel].self) { [weak self] (model) in
guard let `self` = self else { return }
if self.tableView.isHeaderRefresh {
self.dataSource.removeAll()
}
self.tableView.endHeaderRefresh()
self.tableView.endFooterRefresh()
self.dataSource.append(contentsOf: model.data)
self.refreshSeletedData()
} failure: { [weak self] (error) in
guard let `self` = self else { return }
self.tableView.endHeaderRefresh()
self.tableView.endFooterRefresh()
Toast.show(info: error.errorMessage)
}
}
}
5、选中的数据状态处理
/// 刷新正在播放的数据,因为音频播放页面返回到首页都是可以播放的,所以使用单例
/// 放的音频和列表数据做对比,如果id一致,设置isSelected = false
private func refreshSeletedData() {
let item = AudioPlayerViewController.share.playerItemModel
dataSource = dataSource.map { model -> AudioItemModel in
var m = model
if m.id == item.id {
m.isSelected = true
} else {
m.isSelected = false
}
return m
}
tableView.reloadData()
}
列表比较简单,下一篇我们开始封装一个音频播放功能