Swift: ошибка инициализации SwiftySound, если загружено более 49 звуковых файлов - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать простую звуковую панель в Swift с представлением коллекции, каждая кнопка представляет звук, который можно воспроизвести.Структура выглядит следующим образом (я знаю, что это, вероятно, не самый умный способ сделать это, но он работал раньше, пока я не добавил еще несколько звуков): У меня есть SoundFiles.swift с классом SoundFiles, который я объявил

static let shared = SoundFiles()

Содержит два массива

let soundfiles: [String] = ["example_bla"]
let soundnames: [String] = ["example bla"]

, а также

var translation: [String: String] = [:]

var currentSoundfiles: [String] = []

, где словарь "перевода" должен иметь значение между именами файлов и тем, чтоотображается на экране, то есть соответствует массивам «звуковые файлы» и «звуковые имена».Массив «currentSoundfiles» заботится об отображаемых звуковых файлах после применения фильтра (функция поиска).В моем контроллере панели вкладок у меня есть View Controller, содержащий

var soundPlayers: [Sound?] = []

override func viewDidLoad() {
        super.viewDidLoad()

        setUpView()

        setupSwiftySound()

        setupDismissKeyboard()

        SoundFiles.shared.currentSoundfiles = SoundFiles.shared.soundfiles
        SoundFiles.shared.findTranslation()

        fillDropDowns()
        fillSounds()
    }

override func viewDidAppear(_ animated: Bool) {
    refreshCollectionView()
}

, где

func fillSounds(){
    soundPlayers.removeAll()
    for (index, _) in SoundFiles.shared.currentSoundfiles.enumerated(){
        if let playingURL = Bundle.main.url(forResource: SoundFiles.shared.currentSoundfiles[index], withExtension: "wav"){
            soundPlayers.append(Sound(url: playingURL))
            soundPlayers[index]?.volume = SoundFiles.shared.volume
        }
    }
}

- единственная соответствующая функция.Пока я включаю 49 или меньше звуковых файлов, все работает отлично.Включая 50 или более звуковых файлов, следующая ошибка / предупреждение появляется несколько раз:

Ошибка инициализации SwiftySound: Ошибка Domain = NSOSStatusErrorDomain Code = -42 "(null)"

Что странно, так это то, что я все еще могу запустить первые 49 звуковых файлов без проблем (нажатие на другие кнопки просто ничего не делает), но любое другое действие вызывает сбой приложения, например, попытка перейти на другой View Controllerприложения или получения дополнительной информации о звуковом файле, нажав «+» рядом с кнопкой (реализовано с помощью DropDown Menu).Ошибка сбоя при попытке перейти на вторую вкладку View Controller выглядит следующим образом:

Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Не удалось загрузить NIB в комплекте:« NSBundle (загружен)) 'с именем 'fGY-5Н-E9k-вид-OBO-1i-МРО' и каталог 'SbOne.storyboardc'' *** Первый стек бросить вызов: (0x185e48ec4 0x185019a50 0x185d4f594 0x1b2c8fea8 0x1b2a208e0 0x1b2a2128c 0x1b2a21554 0x1b298dea8 0x1b298e1b0 0x1b298f140 0x1b2990440 0x1b2972630 0x1b349177c 0x18a444b7c0x18a449b34 0x18a3a8598 0x18a3d6ec8 0x18a3d7d30 0x185dd87cc 0x185dd3460 0x185dd3a00 0x185dd31f0 0x18804c584 0x1b2fe8c00 0x102474838 0x185892bb4) Libc ++ abi.dylib: оканчивающиеся неперехваченного исключением типа NSException (lldb)

и XCode подводит меня к AppDelegate.swift показывая

Тема 1: сигнал SIGABRT

Проблема не зависит от того, какие звуковые файлы включены, она зависит только от номера.У кого-нибудь есть представление о том, что здесь происходит?

1 Ответ

0 голосов
/ 22 февраля 2019

Как заметил @DavidPasztor, проблема была в памяти, потому что я открывал слишком много звуковых файлов одновременно.Уменьшение свойства playersPerSound до 1 действительно решило проблему, но в какой-то момент это, конечно, повторилось бы.Как я решил эту проблему для меня сейчас так:

Я держал по 5 игроков на звук, чтобы иметь возможность проигрывать звуки чаще, чем один раз до их завершения (важно для других моих раскадровок / контроллеров представления, гдепользователь должен выбрать более короткий список звуков из первого Storyboard / View Controller для быстрого выбора).В первом Storyboard / View Controller я избавился от функции fillSounds и вместо этого использовал следующий код, когда предполагается воспроизведение звука:

@objc func playSound(sender: UIButton){
    if soundPlayers.count >= 20 {
        soundPlayers.removeLast(10)
    }
    if let playingURL = Bundle.main.url(forResource: SoundFiles.shared.currentSoundfiles[sender.tag], withExtension: "wav"){
        soundPlayers.append(Sound(url: playingURL))
        soundPlayers[soundPlayers.count-1]?.volume = SoundFiles.shared.volume
        soundPlayers[soundPlayers.count-1]?.play()
    }
}

Этот фрагмент кода теперь не используетсяиз 5 игроков на звук, но вместо этого добавляет нового игрока для того же звука, если он воспроизводится снова, и удаляет первые 10 игроков, если размер достигает 20. Другие раскадровки / контроллеры представления остаются нетронутыми с ограничением на количество звуков надоска не может превышать 20 (или любое другое разумное число).До сих пор я не сталкивался с такой проблемой в приложении.

...