0

私は構築したメッセージングアプリを持っていて、ユーザーが自分のアプリを使っている都市を表示したいと思います。アプリは、位置データをうまく収集して表示しますが、一度に1つの位置データしか保存しません。たとえば、私がシアトルからアプリに投稿すると、アプリは私がシアトルから投稿していると言うでしょう。しかし、誰かがニューヨークからアプリに投稿すると、シアトルのロケーションデータは上書きされ、すべてのユーザーはニューヨークにいるようになります。これは明らかに重要な問題です。FirebaseからSwiftにデータを保存して検索する方法

FireNetデータベース(私はすでにメッセージングを処理するために使用しています)を使用して、各ユニークユーザのロケーションデータを保存し、投稿時にデータベースから取得することができましたが、成功しなかった私の問題の解決策。

もう一度、場所のデータを収集するのに問題はありません。一意のユーザーごとに固有の場所を保存するだけです。 、Firebaseで

class ChatViewController: JSQMessagesViewController, CLLocationManagerDelegate { 

    // MARK: Properties 


    //Location 
    var city: String = "" 
    var state: String = "" 
    var country: String = "" 
    var locationManager = CLLocationManager() 

    func getLocation() -> String { 
    if country == ("United States") { 
    return (self.city + ", " + self.state) 
    } 
    else { 
    return (self.city + ", " + self.state + ", " + self.country) 
    } 
    } 

    //Firebase 
    var rootRef = FIRDatabase.database().reference() 
    var messageRef: FIRDatabaseReference! 
    var userLocation: FIRDatabaseReference! 

    //JSQMessages 
    var messages = [JSQMessage]() 

    var outgoingBubbleImageView: JSQMessagesBubbleImage! 
    var incomingBubbleImageView: JSQMessagesBubbleImage! 



    override func viewDidLoad() { 
     super.viewDidLoad() 

     locationManager.delegate = self 
     locationManager.requestWhenInUseAuthorization() 

     if CLLocationManager.locationServicesEnabled() { 
      //collect user's location 
      locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers 
      locationManager.requestLocation() 
      locationManager.startUpdatingLocation() 
     } 

     title = "Group Chat" 
     setupBubbles() 
     // No avatars 
     collectionView!.collectionViewLayout.incomingAvatarViewSize = CGSizeZero 
     collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero 

     // Remove file upload icon 
     self.inputToolbar.contentView.leftBarButtonItem = nil; 

     messageRef = rootRef.child("messages") 
     userLocation = rootRef.child("locations") 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     observeMessages() 
    } 

    override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    } 


    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     //--- CLGeocode to get address of current location ---// 
     CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in 

      if let pm = placemarks?.first 
      { 
       self.displayLocationInfo(pm) 
      } 

     }) 

    } 


    func displayLocationInfo(placemark: CLPlacemark?) 
    { 
     if let containsPlacemark = placemark 
     { 

      self.city = (containsPlacemark.locality != nil) ? containsPlacemark.locality! : "" 
      self.state = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea! : "" 
      self.country = (containsPlacemark.country != nil) ? containsPlacemark.country! : "" 

      print(getLocation()) 

     } 

    } 


    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
     print("Error while updating location " + error.localizedDescription) 
    } 


    override func collectionView(collectionView: JSQMessagesCollectionView!, 
           messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! { 
     return messages[indexPath.item] 
    } 

    override func collectionView(collectionView: JSQMessagesCollectionView!, 
           messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! { 
     let message = messages[indexPath.item] // 1 
     if message.senderId == senderId { // 2 
      return outgoingBubbleImageView 
     } else { // 3 
      return incomingBubbleImageView 
     } 
    } 

    override func collectionView(collectionView: UICollectionView, 
           numberOfItemsInSection section: Int) -> Int { 
     return messages.count 
    } 

    override func collectionView(collectionView: JSQMessagesCollectionView!, 
           avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! { 
     return nil 
    } 

    private func setupBubbles() { 
     let factory = JSQMessagesBubbleImageFactory() 
     outgoingBubbleImageView = factory.outgoingMessagesBubbleImageWithColor(
      UIColor.jsq_messageBubbleBlueColor()) 
     incomingBubbleImageView = factory.incomingMessagesBubbleImageWithColor(
      UIColor.jsq_messageBubbleLightGrayColor()) 
    } 

    func addMessage(id: String, text: String) { 
     let message = JSQMessage(senderId: id, displayName: "", text: text) 
     messages.append(message) 
    } 

    override func collectionView(collectionView: UICollectionView, 
           cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) 
      as! JSQMessagesCollectionViewCell 

     let message = messages[indexPath.item] 

     if message.senderId == senderId { 
      cell.textView!.textColor = UIColor.whiteColor() 
     } else { 
      cell.textView!.textColor = UIColor.blackColor() 
     } 

     return cell 
    } 

    override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, 
            senderDisplayName: String!, date: NSDate!) { 

     let itemRef = messageRef.childByAutoId() // 1 
     let messageItem = [ // 2 
      "text": text, 
      "senderId": senderId 
     ] 
     itemRef.setValue(messageItem) // 3 

     // Start storing location data 
     let locRef = userLocation.childByAutoId() 
     let locItem = [ 
      "location": getLocation() 
     ] 
     // Set location data in Firebase 
     locRef.setValue(locItem) 

     // 4 
     JSQSystemSoundPlayer.jsq_playMessageSentSound() 

     // 5 
     finishSendingMessage() 

    } 

    private func observeMessages() { 
     // 1 
     let messagesQuery = messageRef.queryLimitedToLast(25) 
     // 2 
     messagesQuery.observeEventType(.ChildAdded) { (snapshot: FIRDataSnapshot!) in 
      // 3 
      let id = snapshot.value!["senderId"] as! String 
      let text = snapshot.value!["text"] as! String 


      // 4 
      self.addMessage(id, text: text) 

      // 5 
      self.finishReceivingMessage() 
     } 

    } 

    override func textViewDidChange(textView: UITextView) { 
     super.textViewDidChange(textView) 
    } 


    override func collectionView(collectionView: JSQMessagesCollectionView!, attributedTextForCellBottomLabelAtIndexPath indexPath: NSIndexPath!) -> NSAttributedString! { 

     let message = messages[indexPath.item] // 1 

     // This is where I need help retrieving the data from firebase 
     let text = "From: " + getLocation() 

     if message.senderId == senderId { // 2 
      return nil 
     } else { // 3 
      return NSAttributedString(string: text) 
     } 

    } 

    override func collectionView(collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForCellBottomLabelAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return kJSQMessagesCollectionViewCellLabelHeightDefault 
    } 

} 

答えて

2

:ここ

は、以下の私のコードの一部(:申し訳ありませんが、それはとても長いですが、私はおそらく誰かが私の質問に答えることができ任意のコードを省略したくなかった注意してください)です各ユーザーの場所を別々に保管します。つまり、別のユーザーが上書きすることはできません。

データベース構造に新しいブランチを追加します。 ロケーション

次に、 人最後に

、属性場所でユーザーごとに別の子を追加します。

次に、このブランチをクエリしてユーザー情報を取得します。ユーザーの場所を更新すると、の前の場所にあるが上書きされます。 Firebaseについての詳細を学ぶために
https://firebase.google.com/docs/database/ios/save-data#basic_write

: ​​
やデータの更新を行うためのドキュメント:

Firebaseを照会して行うためのドキュメントをお読みください。

+0

私の混乱は、あなたが提案した機能をどのように実装できるかです。 –

+0

答えを更新しました@AhadSheriff – GJZ

+0

ありがとうございました!申し訳ありませんが、Firebaseを初めて使用しています。上記の私のコードを信じて、私は場所の支店を作りました、どのように私は子供の人を追加するのですか? –

関連する問題