我正在嘗試創建帖子,但我必須等待影像上傳到 Firebase 存盤,然后才能真正創建帖子。這只是創建一個帶有空 imageURL 的帖子:
private func createFeedPost(feedPost: FeedPost) {
Task {
await persistImageToStorage()
}
FirebaseManager.shared.firestore.collection("feedposts").document(feedPost.id)
.setData(["commentsCount": feedPost.commentsCount, "description": feedPost.description,
"feedImageUrl": feedPost.feedImageUrl, "id": feedPost.id, "likesCount": feedPost.likesCount,
"locked": feedPost.locked,
"price": feedPost.price, "timestamp": feedPost.timestamp])
}
private func persistImageToStorage() async {
let ref = FirebaseManager.shared.storage.reference(withPath: imageId)
guard let imageData = self.image?.jpegData(compressionQuality: 0.5)
else { return }
ref.putData(imageData, metadata: nil) { metadata, err in
if let err = err {
print(err)
return
}
ref.downloadURL { url, err in
if let err = err {
print(err)
return
}
guard let url = url else { return }
self.imageUrl = url.absoluteString // here is where I set the imageURL
}
}
}
上傳圖片后,有沒有辦法從 Firebase 存盤中取回一些東西?
編輯:
我嘗試使用完成,但這也沒有設定 imageURL
private func persistImageToStorage(complete:()->()) {
let ref = FirebaseManager.shared.storage.reference(withPath: imageId)
guard let imageData = self.image?.jpegData(compressionQuality: 0.5)
else { return }
ref.putData(imageData, metadata: nil) { metadata, err in
if let err = err {
print(err)
return
}
ref.downloadURL { url, err in
if let err = err {
print(err)
return
}
guard let url = url else { return }
self.imageUrl = url.absoluteString
}
}
complete()
}
private func createFeedPost(feedPost: FeedPost) {
persistImageToStorage(complete: { () -> () in
FirebaseManager.shared.firestore.collection("feedposts").document(feedPost.id).setData(["commentsCount": feedPost.commentsCount, "description": feedPost.description, "feedImageUrl": feedPost.feedImageUrl, "id": feedPost.id, "likesCount": feedPost.likesCount, "locked": feedPost.locked, "price": feedPost.price, "timestamp": feedPost.timestamp])
})
}
uj5u.com熱心網友回復:
對于任何time-consumption
or long-waiting
,我建議使用您所考慮的異步邏輯。
這是您typealias
使您的型別定義更有意義的方法。
/// (File URL, Error Message/Code
typealias FireBaseUploadResponseHandler = (String?, String?) -> Void
所以你的代碼將是:
private func persistImageToStorage(image: UIImage?, done: @escaping FireBaseUploadResponse) {
guard let imageData = image?.jpegData(compressionQuality: 0.5)
else { return done(nil, "IMG_TO_DATA_FAILED") }
let imageId = UUID().uuidString
let ref = FirebaseManager.shared.storage.reference(withPath: imageId)
ref.putData(imageData, metadata: nil) { metadata, err in
if let err = err {
print(err)
return done(nil, err.localizedDescription)
}
ref.downloadURL { url, err in
guard let url = url else { return done(nil, err.localizedDescription) }
done(url.absoluteString, nil) // Pass your downloaded URL here to closure `done`
}
}
}
用法:
private func createFeedPost(feedPost: FeedPost, done: escaping (Bool) -> Void) {
self.persistImageToStorage(image: self.image) { url, error in
guard let _url = url else { return done(false) }
// now _url is available to use, it is public url of your uploaded image
FirebaseManager.shared.firestore.collection("feedposts")
.document(feedPost.id)
.setData(["commentsCount": feedPost.commentsCount, "description": feedPost.description,
"feedImageUrl": feedPost.feedImageUrl, "id": feedPost.id, "likesCount": feedPost.likesCount,
"locked": feedPost.locked,
"price": feedPost.price, "timestamp": feedPost.timestamp])
done(true)
}
}
然后
createFeedPost(feedPost: [your post here]) { [weak self] success in
guard let _self = self else { return }
if success {
_self.[your function to notify user that post is created]()
} else {
_self.[your function to notify user that it failed to create the post]()
}
}
對于這一堆代碼:
["commentsCount": feedPost.commentsCount, "description": feedPost.description,
"feedImageUrl": feedPost.feedImageUrl, "id": feedPost.id, "likesCount": feedPost.likesCount,
"locked": feedPost.locked,
"price": feedPost.price, "timestamp": feedPost.timestamp]
我建議您使用任何JSON 編碼器/解碼器/決議器,例如ObjectMapper或Codable(內置)。簡化您的邏輯并易于維護。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/508501.html