Куда поставить DispatchQueue Swift - PullRequest
0 голосов
/ 03 мая 2019

Я новый разработчик.Я использую Swift 4.2 и Xcode 10.2.

Я пытаюсь показать счетчик во время сохранения фотографии.Я тестирую медленное соединение на своем iPhone в режиме разработчика, чтобы проверить его.При использовании кода ниже счетчик не отображается.Представление идет прямо до конца, где отображается кнопка и говорит, что загрузка завершена (когда это не так).Я попытался поместить все это в DispatchQueue.global(qos: .userinitiated).async и затем показать кнопку назад в главной очереди.Я также попытался поместить showSpinner в DispatchQueue.main, а затем savePhoto в .global(qos: .utility).Но я ясно, что не понимаю процессов GCD.

Вот мой код:

func savePhoto(image:UIImage) {

        // Add a spinner (from the Extensions)
        self.showSpinner(onView: self.view)

        PhotoService.savePhoto(image: image) { (pct) in

            // Can show the loading bar here.

        }

       // Stop the spinner
       self.removeSpinner()

       // Show the button.
       self.goToPhotosButtonLabel.alpha = 1
       self.doneLabel.alpha = 1
}

Какие типы DispatchQueues я должен использовать и где их разместить?

Вот код savePhoto:

static func savePhoto(image:UIImage, progressUpdate: @escaping (Double) -> Void) {

    // Get data representation of the image
    let photoData = image.jpegData(compressionQuality:0.1)

    guard photoData != nil else {
        print("Couldn't turn the image into data")
        return
    }

    // Get a storage reference
    let userid = LocalStorageService.loadCurrentUser()?.userId
    let filename = UUID().uuidString
    let ref = Storage.storage().reference().child("images/\(String(describing: userid))/\(filename).jpg")

    // Upload the photo
    let uploadTask = ref.putData(photoData!, metadata: nil) { (metadata, error) in

        if error != nil {

            // An error during upload occurred
            print("There was an error during upload")
        }
        else {
            // Upload was successful, now create a database entry
            self.createPhotoDatabaseEntry(ref: ref, filename: filename)

        }
    }

    uploadTask.observe(.progress) { (snapshot) in

        let percentage:Double = Double(snapshot.progress!.completedUnitCount /
        snapshot.progress!.totalUnitCount) * 100.00

        progressUpdate(percentage)
    } 

}

1 Ответ

0 голосов
/ 03 мая 2019

Поскольку код, сохраняющий фотографию, является асинхронным, ваш текущий код удаляет счетчик сразу после его добавления до завершения загрузки

func savePhoto(image:UIImage) {

    // Add a spinner (from the Extensions)
    self.showSpinner(onView: self.view)

    PhotoService.savePhoto(image: image) { (pct) in

       //  remove spinner when progress is 100.0  = upload complete .
       if pct == 100.0 {
           // Stop the spinner
           self.removeSpinner() 
            // Show the button.
           self.goToPhotosButtonLabel.alpha = 1
           self.doneLabel.alpha = 1

        }
    } 
} 

Здесь вам не нужно использовать GCD, так как загрузка firebase выполняется в другом фоновом потоке, поэтому он не будет блокировать основной поток

...