我有一个拆分视图控制器,顶视图控制器设置为一个表视图控制器,用于显示一个播放列表供选择。第一次加载应用程序时,它会要求获得音乐访问权限。回答是确实给了它权限但表格视图没有显示播放列表。我最终不得不杀死应用程序并再次运行它。我要求音乐库允许错误的地方吗?这是顶视图控制器的viewWillAppear并存储我在一类播放列表中使用的播放列表(因为有些被筛选出来)。
override func viewWillAppear(_ animated: Bool) {
self.clearsSelectionOnViewWillAppear = self.splitViewController!.isCollapsed
super.viewWillAppear(animated)
checkMediaAccessAndSetup()
}
func checkMediaAccessAndSetup() {
let authorizationStatus = MPMediaLibrary.authorizationStatus()
switch authorizationStatus {
case .notDetermined:
// Show the permission prompt.
MPMediaLibrary.requestAuthorization({[weak self] (newAuthorizationStatus: MPMediaLibraryAuthorizationStatus) in
// Try again after the prompt is dismissed.
self?.checkMediaAccessAndSetup()
})
case .denied, .restricted:
// Do not use MPMediaQuery.
return
default:
// Proceed as usual.
break
}
// Do stuff with MPMediaQuery
self.setupPlaylistStore()
tableView.reloadData()
}
答案 0 :(得分:1)
您的代码的主要问题是
您完全没有解决在后台线程上调用requestAuthorization
完成函数这一事实。您需要走出主线程才能在界面上工作。
您已省略了最重要的.authorized
案例。如果您有工作要做,这取决于您的授权状态,如果您获得授权,则必须现在,但如果您未经确定则必须在授权后进行。
因此,这是进行连贯授权检查的正确方案(如果可以的话,f()
就是你总想做的事情):
let status = MPMediaLibrary.authorizationStatus()
switch status {
case .authorized:
f()
case .notDetermined:
MPMediaLibrary.requestAuthorization() { status in
if status == .authorized {
DispatchQueue.main.async {
f()
}
}
}
// ...
}
如果您将此代码抽象为实用程序方法,其中f
可以是任何内容,您可以在应用程序中执行无处不在的,其中可能需要授权 - 而不仅仅是在启动时。< / p>
答案 1 :(得分:-2)
感谢您的评论,它给了我正在进行的多线程的线索,如果类中没有播放列表继续检查并重新加载表数据,我可以通过计时器调用来修复它。
{{1}}