UIImagePickerController вызывает дубликат - PullRequest
0 голосов
/ 14 мая 2018

Я внедряю приложение для социальных сетей, используя Swift.В MyProfileViewController я использовал UIImagePickerController, чтобы изменить изображение профиля текущего пользователя.Однако использование UIImagePickerController вызывает дублирование строк табличного представления, хотя я обрабатываю табличное представление в viewDidLoad, а не в viewWillAppear.

Для иллюстрации вот моя функция viewDidLoad.

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self

    self.automaticallyAdjustsScrollViewInsets = false

    ref = Database.database().reference()
    storageRef = Storage.storage().reference()

    ref.child("users").child((Auth.auth().currentUser?.uid)!).observe(.value, with: {
        (snapshot) in
        let value = snapshot.value as? NSDictionary
        let userId = value?["id"] as! String
        let username = value?["username"] as! String
        let email = value?["userEmail"] as! String
        let profilePictureUrl = value?["profilePicture"] as! String

        self.currentUser = User(id: userId, username: username, email: email, profilePicture: profilePictureUrl)

        self.tableView.reloadData()
    })

    ref.child("posts").observe(.childAdded, with: {
        (snapshot) in
        let value = snapshot.value as? NSDictionary
        let id = value?["id"] as! String
        let tags = value?["tags"] as! String
        let facultyName = value?["faculty"] as! String
        let courseName = value?["course"] as! String
        let questionTitle = value?["title"] as! String
        let questionText = value?["description"] as! String
        let dateAndTime = value?["dateAndTime"] as! String
        let userID = value?["user-id"] as! String

        self.ref.child("users").child(userID).observe(.value, with: {
            (snapshot) in
            let value = snapshot.value as? NSDictionary
            let userId = value?["id"] as! String
            let username = value?["username"] as! String
            let email = value?["userEmail"] as! String
            let profilePictureUrl = value?["profilePicture"] as! String

            let post = Post(id: id, tags: tags, facultyName: facultyName, courseName: courseName, questionTitle: questionTitle, questionText: questionText, dateAndTime : dateAndTime, username: username)

            if userID == Auth.auth().currentUser?.uid {
                self.posts.insert(post, at: 0)
            }

            self.postDictionary[id] = post

            let member = User(id: userId, username: username, email: email, profilePicture: profilePictureUrl)

            if post.username == member.username {
                self.userDictionary[id] = member
            }

            self.tableView.reloadData()
        })
    })    
}

А вот моя функция UIImagePickerController:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let indexPath = NSIndexPath(row: 0, section: 0)
    let cell = tableView.cellForRow(at: indexPath as IndexPath) as! MyProfileInfoCell!

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        selectedImage = image
        cell?.profilePicture.contentMode = .scaleAspectFit
        cell?.profilePicture.image = image
    }

    var data = NSData()
    data = UIImageJPEGRepresentation((cell?.profilePicture.image!)!, 0.8)! as NSData

    let filePath = "\((Auth.auth().currentUser?.uid)!)" // path where you wanted to store img in storage
    let metaData = StorageMetadata()
    metaData.contentType = "image/jpg"

    self.storageRef = Storage.storage().reference()
    self.storageRef.child(filePath).putData(data as Data, metadata: metaData) {
        (metaData,error) in
        if let error = error {
            print(error.localizedDescription)
            return
        } else{
            let downloadURL = metaData!.downloadURL()!.absoluteString

            self.ref.child("users").child((Auth.auth().currentUser?.uid)!).updateChildValues(["profilePicture" : downloadURL])
        }
    }

    self.dismiss(animated: true, completion: nil)

    print(self.posts.count)
}

Моя табличная таблица состоит из 2 ячеек-прототипов.Первая ячейка прототипа предназначена для информации о профиле, в которой обрабатывается изменяющееся изображение профиля.Вторая ячейка прототипа предназначена для отображения сообщений, опубликованных этим пользователем.Проблема возникает здесь.Когда я меняю свой профиль, строки сообщений дублируются.

Кто-нибудь может мне помочь с этим?

1 Ответ

0 голосов
/ 14 мая 2018

Метод наблюдения добавляет наблюдателя к «пользователям» в вашей БД.Каждый раз, когда вы изменяете «пользователей» в БД, выполняется следующий код и в табличное представление добавляется сообщение:

self.ref.child("users").child(userID).observe(.value, with: {
        (snapshot) in
        let value = snapshot.value as? NSDictionary
        let userId = value?["id"] as! String
        let username = value?["username"] as! String
        let email = value?["userEmail"] as! String
        let profilePictureUrl = value?["profilePicture"] as! String

        let post = Post(id: id, tags: tags, facultyName: facultyName, courseName: courseName, questionTitle: questionTitle, questionText: questionText, dateAndTime : dateAndTime, username: username)

        if userID == Auth.auth().currentUser?.uid {
            self.posts.insert(post, at: 0)
        }

        self.postDictionary[id] = post

        let member = User(id: userId, username: username, email: email, profilePicture: profilePictureUrl)

        if post.username == member.username {
            self.userDictionary[id] = member
        }

        self.tableView.reloadData()
    })

Когда вы обновляете изображение профиля, БД также обновляется, и выполняется приведенный выше код.Именно поэтому посты дублируются.Чтобы исправить это, метод меняет метод от наблюдения к наблюдению SingleEvent.Метод наблюдатьSingleEvent запрашивает данные из БД один раз.

self.ref.child("users").child(userID).observeSingleEvent(.value, with: {
        (snapshot) in
        let value = snapshot.value as? NSDictionary
        let userId = value?["id"] as! String
        let username = value?["username"] as! String
        let email = value?["userEmail"] as! String
        let profilePictureUrl = value?["profilePicture"] as! String

        let post = Post(id: id, tags: tags, facultyName: facultyName, courseName: courseName, questionTitle: questionTitle, questionText: questionText, dateAndTime : dateAndTime, username: username)

        if userID == Auth.auth().currentUser?.uid {
            self.posts.insert(post, at: 0)
        }

        self.postDictionary[id] = post

        let member = User(id: userId, username: username, email: email, profilePicture: profilePictureUrl)

        if post.username == member.username {
            self.userDictionary[id] = member
        }

        self.tableView.reloadData()
    })
...