Вы должны использовать UTF8Encoding вместо UnicodeEncoding. Последний кодируется UTF16, поэтому не байт, совместимый с ASCII. Вместо UTF8 байт совместим с ASCII. Оба поддерживают все коды Юникода, поэтому нет потери информации.
Но часто не так повезло, что у вас есть суперсетный кодер. Поэтому в общем случае вы должны отслеживать кодировку (например, в новом поле) или просто использовать одну кодировку (чтобы вы конвертировали все свои базы данных).
Возможны две проблемы:
Как указано в документации для addBoundaryTimeObserver
:
Вы должны поддерживать строгую ссылку на возвращаемое значение как Пока вы хотите, чтобы наблюдатель вызывал наблюдатель времени
blockquote>Поскольку ваш исходный код не сохраняет ссылку на возвращенный внутренний непрозрачный наблюдатель времени, наблюдатель, вероятно, освобождается немедленно и, следовательно, никогда не будет называется.
Убедитесь, что время, которое вы регистрируете для наблюдения, действительно имеет правильное значение:
asset
может быть неизвестна, или неточная оценка, в зависимости от типа актива и состояния загрузки (снова, см. документацию AVAsset.duration
на это). Как следствие, время, которое вы регистрируете для наблюдения, может никогда не быть достигнуто (обратите внимание, что время можно легко проверить, вставив CMTimeShow(duration)
)
[1124 ] Подходы для решения этой проблемы:
, если вы просто хотите остановить игрока, когда достигнут конец playerItem, установки player.actionAtItemEnd
в pause
может быть достаточно
если вам нужно выполнить некоторую настраиваемую логику, когда достигается конец элемента, зарегистрируйте наблюдателя для уведомлений AVPlayerItemDidPlayToEndTime
с playerItem в качестве объекта. Этот механизм не зависит от, возможно, точных длительностей и, следовательно, более надежен