Обозреватель задач загрузки хранилища Firestore не выполняется, пока приложение находится в фоновом режиме - PullRequest
0 голосов
/ 06 января 2019

Я загружаю 2 файла в хранилище, как только оба будут сделаны, должен быть создан документ Firestore. Это прекрасно работает, если приложение находится на переднем плане.

Однако, если приложение переводится в фоновый режим во время загрузки, код наблюдателя .success не выполняется, наблюдатель .progress продолжает работать до тех пор, пока не достигнет 100%, а затем все просто останавливается.

Как только я возвращаю свое приложение на передний план, код выполняется снова (иногда успешно, иногда с ошибкой, указывающей мне проверить ответ сервера).

Кнопка, которая вызывает функции загрузки:

@IBAction func postButtonClicked(_ sender: Any) {
        print("Post button clicked, trying to post...")
        //Make sure we are logged in and have a video
        guard let videoURL = videoURL else {
            print("We don't have a video, why are we trying to post?")
            dismiss(animated: true, completion: nil)
            return
        }

        //1 Create and start uploading thumbnail
        createThumbnail(from: videoURL) { (image) in
            if let image = image {
                self.uploadThumbnailToStorage(image: image)
            }
        }
        //2 Start uploading video
        uploadVideoToStorage(from: videoURL)

        dismiss(animated: true, completion: nil)
    }

И функция загрузки видео:

func uploadVideoToStorage(from url: URL) {
        print("Start uploading video...")
        let storageRef = storage.reference()
        let videoRef = storageRef.child("videos/\(postRef.documentID)_video")

        // Upload the file to the path "videos"
        let uploadTask = videoRef.putFile(from: url, metadata: nil) { metadata, error in
            guard let metadata = metadata else {
                // Uh-oh, an error occurred!
                return
            }
            // Metadata contains file metadata such as size, content-type.
            let size = metadata.size
            print("Video file size: \(size)")

        }

        //Observe uploadTask
        uploadTask.observe(.success) { snapshot in
            snapshot.reference.downloadURL { (url, error) in
                guard let downloadURL = url else {
                    if let error = error {
                        print("Error in video success observer: \(error.localizedDescription)")
                    }
                    return
                }
                print("Video upload success.")
                self.videoString = downloadURL.absoluteString
                self.videoUploadComplete = true

                self.checkIfUploadsAreComplete()
            }
        }

        uploadTask.observe(.progress) { snapshot in
            let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount)
                / Double(snapshot.progress!.totalUnitCount)
            print("Uploading video: \(percentComplete.rounded())%")
        }

    }

Функция checkIfUploadsAreComplete () проверяет, завершены ли обе задачи загрузки, а затем записывает документ, но я не думаю, что этот код имеет значение.

Я попытался поместить функцию uploadVideoToStorage () в фоновый режим следующим образом:

DispatchQueue.global(qos: .background).async {
            // Request the task assertion and save the ID.
            self.backgroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "TestVideoUpload") {
                // End the task if time expires.
                UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
                self.backgroundTaskID = UIBackgroundTaskIdentifier.invalid
            }

            // Send the data synchronously.
            DispatchQueue.main.async {
            self.uploadVideoToStorage(from: videoURL)
            }

            // End the task assertion.
            UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
            self.backgroundTaskID = UIBackgroundTaskIdentifier.invalid
        }

Но это ничего не делало, какие-нибудь мысли?

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