Проблемы с извлечением типов уведомлений из Firebase - PullRequest
1 голос
/ 05 февраля 2020

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

Correct image

На изображении выше, так должны выглядеть ячейки, когда пользователь отправляет уведомление в firebase. Пользователь, связанный с указанным c типом уведомления, который вызывается и публикуется на экране.

Correct OddJobs Data structure.

В структуре firebase мы видим, что вся сохраненная информация сохраняется под UID пользователя на первом изображении и устанавливается под это указывает c уведомление пользователей, чтобы показать, кто отправляет им уведомление, которое является правильным. Эти имена пользователей и изображения показывают отлично, а также изображение справа.

Код, который я использую для сохранения этой информации, приведен ниже,

    fileprivate func saveSwipeToDataBase(didLike: Any) {
    let swipeDate = Int(NSDate().timeIntervalSince1970)
    guard let uid = Auth.auth().currentUser?.uid else { return }

    guard let cardUID = topCardView?.cardViewModel.uid else { return }

    let documentData = ["workerId": uid,
                        "didLike": didLike,
                        "checked": 0,
                        "Swipe Date": swipeDate,
                        "type": SWIPE_INT_VALUE,
                        "posterId" : cardUID] as [String : Any]

    self.postJobNotificationsIntoDatabseWithUID(uid: cardUID, values: documentData as [String : AnyObject])
}

private func postJobNotificationsIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
    let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
        let usersReference = ref.child("notifications").child(uid).childByAutoId()
        usersReference.setValue(values, withCompletionBlock: { (err, ref) in
        if err != nil {
            print("error saving data into firebase")
            return
        }
    })
}

И ниже показано, как я получаю эту информацию и сохраняю ее в контроллере просмотра уведомлений.

 func fetchNotifications() {

guard let currentUID = Auth.auth().currentUser?.uid else { return }
NOTIFICATIONS_REF.child(currentUID).observeSingleEvent(of: .value) { (snapshot) in
guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
    print(dictionary)

    for (_, postingRawData) in dictionary {
guard let postingDictionary = postingRawData as? Dictionary<String, AnyObject> else { continue }
guard let uid = postingDictionary["workerId"] as? String else { continue }

    Database.fetchUser(with: uid, completion: { (user) in
        if let postId = postingDictionary["posterId"] as? String {

            Database.fetchPoster(with: postId, completion: {(poster) in

                let notification = userNotifications(user: user, poster: poster, dictionary: postingDictionary)
                self.notifications.append(notification)
                self.handleSortNotification()

            })

        } else {
            let notification = userNotifications(user: user, dictionary: postingDictionary)
            self.notifications.append(notification)
            self.handleSortNotification()
        }

    })
 }
}

}

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

class userNotifications {

// MARK: - establish notificationTypes

enum NotificationType: Int, Printable {

    case swipe
    case accepted
    case confirmed
    case completed
    case pay

    var description: String {
        switch self {
        case .swipe: return " swiped on your Job "
        case .accepted: return " accepted you to complete the job, "
        case .confirmed: return " confirmed the job"
        case .completed: return " completed the job"
        case .pay: return " pay for completed"

        }
    }

    init(index: Int) {
        switch index {
        case 0: self = .swipe
        case 1: self = .accepted
        case 2: self = .confirmed
        case 3: self = .completed
        case 4: self = .pay

        default: self = .swipe
        }
    }
}

// MARK: - access firebaseData

var creationDate: Date!
var timeDate: Date!
var uid: String!
var fromId: String?
var workerId: String?
var user: User!
var poster: Poster!
var type: Int?
var notificationType: NotificationType!
var didCheck = false

init(user: User? = nil, poster: Poster? = nil, dictionary: Dictionary<String, AnyObject>) {

    self.user = user

    if let poster = poster {
        self.poster = poster
    }

    if let swipeDate = dictionary["Swipe Date"] as? Double {
        self.creationDate = Date(timeIntervalSince1970: swipeDate)
    }

    if let createDate = dictionary["creationDate"] as? Double {
               self.creationDate = Date(timeIntervalSince1970: createDate)
           }

    if let swipeDate = dictionary["time&date"] as? Double {
            self.timeDate = Date(timeIntervalSince1970: swipeDate)
        }

    if let type = dictionary["type"] as? Int {
        self.notificationType = NotificationType(index: type)
    }

    if let uid = dictionary["uid"] as? String {
        self.uid = uid
    }

    if let fromId = dictionary["fromId"] as? String {
        self.fromId = fromId
    }

    if let workerId = dictionary["workerUID"] as? String {
              self.workerId = workerId
          }

    if let checked = dictionary["checked"] as? Int {
        if checked == 0 {
            self.didCheck = false
        } else {
            self.didCheck = true
        }
    }
}
 }

Выше приведены различные типы уведомлений, которые нужно установить.

Теперь, моя проблема в том, что если я вызываю другой тип уведомления, такой как .accepted, информация вызывает совсем другим способом.

incorrect

Изображение выше кажется правильным, однако имя и изображение неверны. это должно быть от пользователя ZacheryWilcox вместо Cjbwjdhbe. пользователь Cjbwjdhbe является текущим пользователем и пользователем, который должен получать уведомления от Zacherywilcox. не от себя.

В базе данных Firebase информация сохраняется как

not sure if im correct

код, который я использую для сохранения этой информации, ниже

    var workerUser: User? {

didSet {


    let name = workerUser?.name
    workerNameLabel.text = name

    let workersUID = workerUser?.uid
    workerNameLabel.text = name

    guard let profileImage = workerUser?.profileImageUrl else { return      }
    workerImageView.loadImageUsingCacheWithUrlString(profileImage)


   }
   }

  func saveUserData() {
      let workUser = self.workerUser
      guard let uid = Auth.auth().currentUser?.uid else { return }
      let workerId = workUser?.uid

       Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
        guard let dictionary = snapshot.value as? [String : Any] else { return }
        let user = User(dictionary: dictionary as [String : AnyObject])
        workUser?.uid = snapshot.key

        self.datePicker.datePickerMode = UIDatePicker.Mode.date
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MMMM dd yyyy/ hh:mm a"
        let selectedDate = dateFormatter.string(from: self.datePicker.date)
        let creationDate = Int(NSDate().timeIntervalSince1970)
        print(selectedDate)

        let docData: [String: Any] = [

                       "workerId": workerId!,
                       "time&date": selectedDate,
                       "posterId" : uid,
                       "creationDate": creationDate,
                       "location": user.address!,
                       "type": 1,
                       "jobPost": "someUIDString",
                       "checked": 0,

                   ]

        self.postJobNotificationsIntoDatabseWithUID(uid: workerId!, values: docData as [String : AnyObject])

     }, withCancel: { (err) in
        print("attempting to load information")
        })

        print("Finished saving user info")
        self.dismiss(animated: true, completion: {
            print("Dismissal complete")
        })


    }

 private func postJobNotificationsIntoDatabseWithUID(uid: String, values: [String: AnyObject]) {
    let ref = Database.database().reference(fromURL: "https://oddjobs-b131f.firebaseio.com/")
        let usersReference = ref.child("notifications").child(uid).childByAutoId()
        usersReference.setValue(values, withCompletionBlock: { (err, ref) in
        if err != nil {
            print("error saving data into firebase")
            return
        }
    })
}

Когда тип .accepted используется для того, чтобы отличить, какой вызывается NotificationType, пользователь, отправивший уведомление, не установлен правильно, и я понятия не имею, в чем причина этого. Правильный пользователь, который отправляет эту информацию, - это Zacherywilcox, и для этого изображения и имени пользователя должно быть установлено окно уведомлений пользователя. не пользователь Cjbe ... Мне было интересно, если кто-нибудь может помочь мне решить эти проблемы. Заранее спасибо. Я начинаю думать, что то, как я сохраняю информацию о пользователях при принятии пользователя, неверно.

Когда я загружаю уведомления (), возможно ли, что вызов

   guard let uid = postingDictionary["workerId"] as? String else { continue }

Database.fetchUser(with: uid, completion: { (user) in
    if let postId = postingDictionary["posterId"] as? String { 

влияет на происходящее? Если да, то есть ли способ различить, какой именно компонент visibleType вызывается, и получать уведомления, которые были вызваны соответствующими пользователями?

1 Ответ

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

Просто обновите ваш код до:

func fetchNotifications() {


    guard let currentUID = Auth.auth().currentUser?.uid else { return }
    NOTIFICATIONS_REF.child(currentUID).observeSingleEvent(of: .value) { (snapshot) in
    guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
        print(dictionary)

         let notificationId = snapshot.key

        for (_, postingRawData) in dictionary {
    guard let postingDictionary = postingRawData as? Dictionary<String, AnyObject> else { continue }
            guard let type = postingDictionary["type"] as? Int else { continue }
            guard let uid = (type == userNotifications.NotificationType.accepted.rawValue) ? postingDictionary["fromId"] as? String : postingDictionary["workerId"] as? String else { continue }

        Database.fetchUser(with: uid, completion: { (user) in
            if let postId = postingDictionary["fromId"] as? String {

                Database.fetchPoster(with: postId, completion: {(poster) in

                    let notification = userNotifications(user: user, poster: poster, dictionary: postingDictionary)
                    self.notifications.append(notification)
                    self.handleSortNotification()

                })

            } else {
                let notification = userNotifications(user: user, dictionary: postingDictionary)
                self.notifications.append(notification)
                self.handleSortNotification()
            }
                 // NOTIFICATIONS_REF.child(currentUID).child(notificationId).child("checked").setValue(1)
        })
     }
    }
  }

Это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...