Я не могу получить какой-либо вывод в консоли с помощью NotificationCenter в Swift iOS - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в Swift Programing Languge и пытаюсь получить вывод, когда песня меняется. Код не содержит ошибок.

Ниже приведен мой код

import UIKit

import MediaPlayer

class ViewController: UIViewController {

var trackChangedObserver : AnyObject?
override func viewDidLoad() {
    super.viewDidLoad()
    trackChangedObserver = NotificationCenter.default
        .addObserver(forName: .MPMusicPlayerControllerNowPlayingItemDidChange,
                     object: nil, queue: OperationQueue.main) { (notification) -> Void in
                        self.updateTrackInformation()
    }

}
deinit {
    NotificationCenter.default.removeObserver(trackChangedObserver!)
}

 func updateTrackInformation() {
    let musicPlayer = MPMusicPlayerController.systemMusicPlayer
    musicPlayer.beginGeneratingPlaybackNotifications()

    let currentTrack: MPMediaItem? = musicPlayer.nowPlayingItem
    let title = currentTrack?.value(forProperty: MPMediaItemPropertyTitle)
        as? String ?? "None"
    print(title)
    let artist = currentTrack?.value(forProperty: MPMediaItemPropertyArtist)
        as? String ?? "None"
    print(artist)
    let album = currentTrack?.value(forProperty: MPMediaItemPropertyAlbumTitle)
        as? String ?? "None"
    print(album)

}

}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Прежде всего, вы должны вызвать это в viewDidLoad или ранее, или уведомления не будут отправлены:

let musicPlayer = MPMusicPlayerController.systemMusicPlayer
musicPlayer.beginGeneratingPlaybackNotifications()

Вторая проблема связана с управлением памятью (цикл сохранения):

trackChangedObserver = NotificationCenter.default
    .addObserver(forName: .MPMusicPlayerControllerNowPlayingItemDidChange,
                 object: nil, queue: OperationQueue.main) { [weak self] notification  -> Void in
                    self.updateTrackInformation() //!!!!!
}

Вы фиксируете здесь self как сильную ссылку. И NotificationCenter сохранит его навсегда, поэтому ваш ViewController никогда не будет уничтожен и метод deinit не будет вызван. Чтобы исправить, добавьте [слабое я] к закрытию (как я делал выше).

0 голосов
/ 21 апреля 2020

Вы можете сделать это следующим образом:

let nc = NotificationCenter.default

n c .post (name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)

Чтобы зарегистрироваться, чтобы получить отправленное уведомление, используйте это:

nc.addObserver(self, selector: #selector(updateTrackInformation()), name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)

    @objc func updateTrackInformation(notification: NSNotification) {
    let musicPlayer = MPMusicPlayerController.systemMusicPlayer
    musicPlayer.beginGeneratingPlaybackNotifications()

    let currentTrack: MPMediaItem? = musicPlayer.nowPlayingItem
    let title = currentTrack?.value(forProperty: MPMediaItemPropertyTitle)
        as? String ?? "None"
    print(title)
    let artist = currentTrack?.value(forProperty: MPMediaItemPropertyArtist)
        as? String ?? "None"
    print(artist)
    let album = currentTrack?.value(forProperty: MPMediaItemPropertyAlbumTitle)
        as? String ?? "None"
    print(album)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...