Быстрая ошибка "UIButton.currentTitle должен использоваться только из основного потока" - PullRequest
0 голосов
/ 13 января 2019

Я только что пошел по этому уроку по следующей ссылке:

URL: https://www.youtube.com/watch?v=aiXvvL1wNUc

Я сталкиваюсь с ошибкой, говорящей "UIButton.currentTitle должен использоваться только из основного потока"

Не совсем уверен, как это исправить, поскольку я новичок в создании приложений, кто-нибудь может мне помочь?

С благодарностью и заранее спасибо!

enter image description here

import UIKit
import MediaPlayer

class GenreButtonScreen: UIViewController {
    var musicPlayer = MPMusicPlayerController.applicationMusicPlayer

    @IBAction func genreButtonTapped(_ sender: UIButton) {
        MPMediaLibrary.requestAuthorization { (status) in
            if status == .authorized {
                self.playGenre(genre: sender.currentTitle!)
            }
        }
    }

    @IBAction func stopButtonTapped(_ sender: UIButton) {
        musicPlayer.stop()
    }

    @IBAction func nextButtonTapped(_ sender: UIButton) {
        musicPlayer.skipToNextItem()
    }

    func playGenre(genre:String) {
        musicPlayer.stop()

        let query = MPMediaQuery()
        let predicate = MPMediaPropertyPredicate(value: genre, forProperty: MPMediaItemPropertyGenre)

        query .addFilterPredicate(predicate)

        musicPlayer.setQueue(with: query)
        musicPlayer.shuffleMode = .songs 
        musicPlayer.play()
    }
}

Ответы [ 2 ]

0 голосов
/ 13 января 2019

MPMediaLibrary.requestAuthorization является асинхронным вызовом, и компоненты макета могут быть изменены только в главном потоке. Вы должны использовать этот способ:

 MPMediaLibrary.requestAuthorization { (status) in
    if status == .authorized {
        DispatchQueue.main.async { 
           self.playGenre(genre: sender.currentTitle ?? String()) 
        }
    }
}
0 голосов
/ 13 января 2019

Поскольку завершение requestAuthorization находится в фоновом потоке, вам необходимо встроить любой код UIKit в основную очередь, например,

DispatchQueue.main.async { 
  self.playGenre(genre: sender.currentTitle!) 
}

@IBAction func genreButtonTapped(_ sender: UIButton) {
    MPMediaLibrary.requestAuthorization { (status) in
        if status == .authorized {
            DispatchQueue.main.async {
              self.playGenre(genre: sender.currentTitle!) 
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...