Я использую библиотеку Google Promises для Swift , но она никогда не выполняет пройденное закрытие.Я подозреваю, что это может быть связано с вложенными обещаниями, но не может заставить код работать.
internal func flow(){
loginToFacebook().then {token in
return self.signIntoFirebase(accessToken: token)
}.then { token in
return self.getUserDocumentFromFirebase(userId: token.userId!)
}.then { token, document in
if document?.exists == false {
// ### Notice no return here, is this the issue?
self.makeFacebookGraphRequest(accessToken: token).then { user in
return self.downloadFacebookProfilePictureAsImage(userModel: user)
}.then { (arg) in
let (user, image) = arg
// Never completes this function, and the closure that I pass never gets called but the image gets saved
return self.saveUserProfilePictureToFirestore(user: user, profileImage: image)
}.then { user in
return self.getProfilePictureUrlFromFirestoreForUser(user: user)
}.then { user, imageUrl in
return self.createNewUserDocumentAsDictionary(user: user, avatarUrl: imageUrl)
}.then { (arg) in
let (user, userDictionary) = arg
return self.saveUserDocumentToFirestore(user: user, data: userDictionary)
}.then {
self.performSegue(withIdentifier: "TermsViewController", sender: self)
}
} else {
self.dismiss(animated: true, completion: nil)
}
}.catch { error in
self.log.error(error.localizedDescription)
}.always {
//Dependency.dismissHud(self.hud, "Test title", "Test message text", 3)
}
}
Функция self.saveUserProfilePictureToFirestore (...) получает вызов, изображение сохраняется в firebase, но закрытие никогда не вызывается, и программа, кажется, зависает.
fileprivate func saveUserProfilePictureToFirestore(user: User, profileImage: UIImage) -> Promise<User> {
self.log.info("->")
return Promise {fulfill, reject in
guard let filename = user.uid else {
reject(ClassError.invalidUserObject)
return
}
guard let profileImageUploadData = UIImageJPEGRepresentation(profileImage, 0.3) else {
self.log.error("->Guard Failure: Image not instantiated")
reject(ClassError.couldNotGetImageData)
return
}
let ref = Storage.storage().reference().child("profileImages").child(filename+".jpg")
ref.putData(profileImageUploadData, metadata: nil) { (nil, err) in
self.log.info("--->{PutDataClosure}")
if let error = err {
self.log.error("->\(error)")
reject(ClassError.couldNotsaveProfilePictureToFirestore)
}else{
fulfill(user)
}
self.log.info("<---{PutDataClosure}")
}
self.log.info("<-")
}
}