Итак, у меня есть приложение, которое принимает и записывает видео для отправки на сервер и последующего просмотра.
Последовательность событий следующая
1. Видео записано
2. Фильтр или текст добавлен
3. Отправлено на сервер
4. Откажитесь от avplayer и вернитесь к камере
Все работает, но на четвертом шаге avplayer никогда не отказывается, и все, что я вижу, это.
Это изображение всех компонентов пользовательского интерфейса на контроллере avplayer, за исключением реального видео.
Я позаботился о том, чтобы я вызвал «присутствовать» и «уволить», чтобы не было проблемы, когда я использовал неправильную комбинацию методов представления контроллера представления и увольнения. Когда я добираюсь до этого экрана, мне нужно снова нажать X, чтобы вернуться к камере, чего не должно быть.
/// Add the story to firebase
func handleAddToStory() {
print("Attempting to add to story")
self.dismiss(animated: true, completion: nil)
// hide the color slider so we can return the image of the tapView that contains the text field if they added one
colorSlider.isHidden = true
colorSlider.isHidden = false
DispatchQueue.global(qos: .background).async {
print("This is run on the background queue")
let videoImage = self.imageWithView(inView: self.tapView)
// Export the video
self.video?.exportFilterVideo(videoComposition: self.avVideoComposition , completion: { (url) in
if let videoImage = videoImage {
let filterVideoAsset = AVAsset(url: url! as URL)
// Now merge the filtered video with tapView image which will contain the textfield if the user added one
Merge(config: .standard).overlayVideo(video: filterVideoAsset, overlayImage: videoImage, completion: { (finalVideoUrl) in
// Upload to firebase storage
let dateFormatter = ISO8601DateFormatter()
let timeStamp = dateFormatter.string(from: Date())
let uid = User.current.uid
let storageRef = Storage.storage().reference().child("event_stories").child(self.eventKey).child(uid).child(timeStamp + ".mp4")
StorageService.uploadVideo(finalVideoUrl! as URL, at: storageRef) { (downloadUrl) in
guard let downloadUrl = downloadUrl else {
return
}
let videoUrlString = downloadUrl.absoluteString
print(videoUrlString)
// Post to firebase
PostService.create(for: self.eventKey, for: videoUrlString)
}
}, progressHandler: { _ in })
} else {
let dateFormatter = ISO8601DateFormatter()
let timeStamp = dateFormatter.string(from: Date())
let uid = User.current.uid
let storageRef = Storage.storage().reference().child("event_stories").child(self.eventKey).child(uid).child(timeStamp + ".mp4")
StorageService.uploadVideo(url! as URL, at: storageRef) { (downloadUrl) in
guard let downloadUrl = downloadUrl else {
return
}
let videoUrlString = downloadUrl.absoluteString
print(videoUrlString)
PostService.create(for: self.eventKey, for: videoUrlString)
}
//svprogresshud insert here
}
})
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
self.dismiss(animated: true, completion: nil)
self.videoPlayer?.replaceCurrentItem(with: nil)
}
}
}
Это функция, которая обрабатывает добавление на сервер. Выполняется некоторая асинхронная задача, но она не должна вмешиваться в увольнение контроллера, которое видно внизу. У кого-нибудь есть идеи, почему контроллер представления все еще присутствует?
Ниже приведен фрагмент кода, представляющий вышеупомянутый контроллер представления.
if let event = self.event {
let video = AVURLAsset(url: videoURL)
let videoViewController = FilterVideoViewController(video: video)
videoViewController.event = event
SVProgressHUD.dismiss(completion: {
self.present(videoViewController, animated: false, completion: nil)
})
}