Я новый разработчик.Я использую 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)
}
}