首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速询问初始视图控制器的音乐权限

快速询问初始视图控制器的音乐权限
EN

Stack Overflow用户
提问于 2017-09-28 14:01:14
回答 2查看 910关注 0票数 1

我有一个分割视图控制器,顶部视图控制器设置为表视图控制器,即显示供选择的播放列表列表。第一次加载该应用程序时,它要求获得音乐访问权限。回答“是”确实给了它权限,但“表”视图没有显示播放列表。最后,我不得不杀死这个应用程序,并再次运行它。我是不是在错误的地方要求音乐图书馆的许可?它是在顶级视图控制器的viewWillAppear中,并将我使用的播放列表(因为有些是筛选出来的)存储在一类播放列表中。

代码语言:javascript
复制
        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()
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-28 16:52:20

代码的主要问题是

  • 您完全无法处理在后台线程上调用requestAuthorization完成函数这一事实。您需要跳出主线程来完成接口的工作。
  • 您忽略了最重要的.authorized案例。当您有工作要做,这取决于您的授权状态,您必须现在做,如果您是授权的,但授权后,如果您还没有确定。

因此,这是进行一致授权检查的正确方案(如果可以的话,f()是您一直想要做的事情):

代码语言:javascript
复制
let status = MPMediaLibrary.authorizationStatus()
switch status {
case .authorized:
    f()
case .notDetermined:
    MPMediaLibrary.requestAuthorization() { status in
        if status == .authorized {
            DispatchQueue.main.async {
                f()
            }
        }
    }
// ...
}

如果您将这些代码抽象为实用程序方法(其中f可以是任何东西),那么您可以在应用程序中的任何地方都这样做--在应用程序中需要授权--而不仅仅是在启动时。

票数 1
EN

Stack Overflow用户

发布于 2017-09-28 15:44:43

谢谢你的评论,它为我提供了正在进行的多线程的线索,如果课堂上没有播放列表来继续检查和重新加载表数据,我就可以通过计时器调用来修复它。

代码语言:javascript
复制
override func viewWillAppear(_ animated: Bool) {
    self.clearsSelectionOnViewWillAppear = self.splitViewController!.isCollapsed
    super.viewWillAppear(animated)

    checkMediaAccess()
    self.setupPlaylistStore()
    tableView.reloadData()
    if store.allPlaylists.count < 1 {
        playlistTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:     #selector(self.playlistTimerCall), userInfo: nil, repeats: true)
    }
}

@objc func playlistTimerCall() {
    self.setupPlaylistStore()
    if store.allPlaylists.count > 1 {
        tableView.reloadData()
        playlistTimer?.invalidate()
    }
}
func checkMediaAccess() {
    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?.checkMediaAccess()
        })
    case .denied, .restricted:
        // Do not use MPMediaQuery.
        return
    default:
        // Proceed as usual.
        break
    }
}


func setupPlaylistStore() {

    // purge store
    store.clearAllPlaylists()

    // create a query of media items in playlist
    let myPlayListsQuery = MPMediaQuery.playlists()
    if myPlayListsQuery.collections != nil {
        playlists = myPlayListsQuery.collections!
    }

    // add playlists to MyPlaylist(s)
    if playlists.count > 0 {
        for index in 0...playlists.count - 1 {
            let playlist = playlists[index]
            store.addPlaylist(playlist: playlist as! MPMediaPlaylist)
        }
    }
    var toBeRemoved = [Int]()
    let defaults = UserDefaults.standard
    if defaults.bool(forKey: "exclude_smart_playlists") {
        //smart
        for index in 0...(playlists.count - 1) {
            let playlist = playlists[index]
            let theAttributes = playlist.value(forProperty: MPMediaPlaylistPropertyPlaylistAttributes) as! Int
            if theAttributes == 2 {
                toBeRemoved.append(index)
            }
        }
    }
    if defaults.bool(forKey: "exclude_folders") {
        //folders
        for index in 0...(playlists.count - 1) {
            let playlist = playlists[index]
            let isFolder = playlist.value(forProperty: "isFolder")
            let stringIsFolder = String("\(String(describing: isFolder))")
            if ((stringIsFolder.range(of: "1")) != nil) {
                toBeRemoved.append(index)
            }
        }
    }
    //sort from the last to the first so i don't reindex
    let reverseSortedPlaylists = toBeRemoved.sorted(by: >)

    // remove the unwanted playlists
    for list in reverseSortedPlaylists {
        store.removePlaylist(index: list)
    }
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46471116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档