Почему Firebase Storage перезаписывает хранилище, в котором должны храниться все пользовательские изображения при каждой загрузке фотографии? - PullRequest
1 голос
/ 05 февраля 2020

Я почти уверен, что ошибка лежит в заданной строке. Я думал, что .key должен был сделать запись динамической c, но вместо этого дочерний фотопост перезаписывается каждый раз. Что мне нужно изменить, чтобы каждая загрузка сохранялась и перезаписывалась.

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, но я не понимаю, как это может логически вызвать перезапись. Я почти уверен, что это не то, что вызывает перезапись.

Обновление после правильного ответа:

Загрузка изображения.

 public override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

   let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell

    let immy = cell.viewWithTag(1) as! UIImageView



        let person: Userx = people[indexPath.row]


        cell.postID = self.people[indexPath.row].postID


        if let PhotoPosts = person.PhotoPosts {
            let url = URL(string: PhotoPosts)
            immy.sd_setImage(with: url)

        }


        return cell

........

for people in snapshot.children.allObjects as! [DataSnapshot] {

                    if people.key != thisUsersUid {
                        print("peoplekey",people.key)
                       let peoplePhotoPosts = peopleObject?["PhotoPosts"]  as? String
                            let peopl = Userx(PhotoPosts: peoplePhotoPosts, imageDownloadURL: peopleimageDownloadURL, postID: peoplepostID, ...)
                    self.people.append(peopl)





                    self.people.append(peopl)

1 Ответ

0 голосов
/ 05 февраля 2020

Поскольку у вас есть только один newPostKey, он может иметь только одно значение за раз. Таким образом, в этих двух строках вы в конечном итоге ссылаетесь на одно и то же местоположение в облачном хранилище:

let newImageRef = imageStorageRef.child(newPostKey)
let newImageRef1 = imageStorageRef.child(newPostKey)

И поскольку newImageRef и newImageRef1 указывают на одно и то же местоположение, последняя запись перезаписывает все, что находится в этом месте уже.

Я думаю, что вы хотите записать в два разных места на основе ключа базы данных самого низкого уровня, и в этом случае вам нужно будет убедиться, что вы настроили ссылки на хранилище на основе отдельных ключей.

Например:

let newImageRef = imageStorageRef.child(newPostRef.key)
let newImageRef1 = imageStorageRef.child(newPostRef1.key)
...