Я создаю приложение для музыкального проигрывателя, предназначенное для имитации автоматизации потоковой передачи радио или Интернета. Мне уже удалось извлечь музыку из плейлистов и отфильтровать по последней дате воспроизведения, чтобы песни не часто повторялись (любимая мозоль в моем iPod). Я хочу, чтобы он каждые четверть часа проигрывал короткие идентификаторы станций из отдельного списка воспроизведения, а затем возвращался к текущему списку воспроизведения или переключался на новый. Блокпосты, с которыми я сталкиваюсь, получают повторяющийся таймер, чтобы дождаться окончания песни перед воспроизведением идентификатора и воспроизвести только один идентификатор перед переключением обратно на музыку. Наблюдатель уведомлений…
NotificationCenter.default.addObserver(self, selector:#selector(ViewController.quarterHour), name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)
…срабатывает таймер…
self.timer2 = Timer(fireAt: date, interval: 1, target: self, selector: #selector(ViewController.runVoicer(_:)), userInfo: nil, repeats: true)
self.timer2.tolerance = 0.1
…который запускает эту функцию:
@objc func quarterHour() {
self.timer2 = Timer.scheduledTimer(timeInterval: 900, target: self, selector: #selector(ViewController.runVoicer(_:)), userInfo: nil, repeats: true)
self.timer2.tolerance = 0.1
}
Медиа-запрос, который выбирает из плейлиста Voicers…
@objc func runVoicer(_:AnyObject) {
mp.pause()
let queryVoice = MPMediaQuery.songs()
let predicate = MPMediaPropertyPredicate(value: "Voicers",
forProperty: MPMediaPlaylistPropertyName,
comparisonType: .equalTo)
queryVoice.addFilterPredicate(predicate)
var collection = [MPMediaItem]()
let unixDefault = Date(timeIntervalSince1970: 100)
if let voicers = queryVoice.items {
collection = voicers.sorted{$0.lastPlayedDate ?? unixDefault > $1.lastPlayedDate ?? unixDate}
}
let voiceCollection = MPMediaItemCollection(items: collection)
mp.setQueue(with: voiceCollection)
mp.play()
fetchRockPlaylist()
}
… не только прерывает песню, когда таймер срабатывает, вместо использования уведомления «…NowPlayingItemDidChange», но также продолжает играть, вместо этого возвращаясь к функции, указанной внизу, после одного воспроизведения, потому что я не могу найти какой-либо метод для изоляции первого элемента в массив голосовой коллекции.