我很确定错误在于设定行中。我以为.key应该可以使写作变得动态起来,但是孩子的photopost每次都会被覆盖。我需要更改什么才能将每个上载存储或覆盖。
class post{
var imageDownloadURL: String?
var image: UIImage!
var caption: String!
init(image: UIImage, caption: String) {
self.image = image
self.caption = caption
}
func save() {
let uid = Auth.auth().currentUser!.uid
let newPostRef = Database.database().reference().child("people").child(uid).child("PhotoPosts")
let newPostRef1 = Database.database().reference().child("people").child(uid).child("PhotoPosts1")
let newPostKey = newPostRef.key
if let imageData = image.jpegData(compressionQuality: 0.6){
let imageStorageRef = Storage.storage().reference().child("images")
let newImageRef = imageStorageRef.child(newPostKey)
let newImageRef1 = imageStorageRef.child(newPostKey)
newImageRef.putData(imageData).observe(.success, handler: {(snapshot) in
self.imageDownloadURL =
snapshot.metadata?.downloadURL()?.absoluteString
newPostRef.setValue(self.imageDownloadURL as Any)
})
newImageRef1.putData(imageData).observe(.success, handler: {(snapshot) in
self.imageDownloadURL = snapshot.metadata?.downloadURL()?.absoluteString
let keyToPost = Database.database().reference().child("people").child(uid).childByAutoId().key
let f1: [String: Any] = [(keyToPost) : self.imageDownloadURL as Any]
newPostRef1.updateChildValues(f1)
})
}
}
}
这是数据库规则:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
注:我知道newimageref1与newimageref指的是同一事物,但是我不认为这在逻辑上会导致覆盖。我很确定那不是造成覆盖的原因。
由于您只有一个newPostKey
,因此一次只能有一个值。因此,在这两行中,您最终引用了Cloud Storage中的相同位置:
let newImageRef = imageStorageRef.child(newPostKey)
let newImageRef1 = imageStorageRef.child(newPostKey)
并且由于newImageRef
和newImageRef1
指向相同的位置,所以最后一次写入已覆盖该位置上的所有内容。
我认为您想根据最低级别的数据库密钥写入两个不同的位置,在这种情况下,您需要确保根据各个密钥来设置存储引用。
例如:
let newImageRef = imageStorageRef.child(newPostRef.key)
let newImageRef1 = imageStorageRef.child(newPostRef1.key)