0

У меня есть viewcontroller, отображающий сообщение, используя tableview и ячейки. Все данные извлекаются из Firebase (базы данных и пользователей).Показать сообщения от TableView только с текущего пользователя Войти

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

Я хочу показать только горшки от текущего пользователя в этом контроллере таблицы. Как это возможно?

Моя база данных построена так:

enter image description here

Для моей страницы входа, я использую следующее:

// 
// ViewController.swift 
// MobileAppDemo 
// 
// Created by Mikko Hilpinen on 27.10.2016. 
// Copyright © 2016 Mikkomario. All rights reserved. 
// 

import UIKit 
import FBSDKCoreKit 
import FBSDKLoginKit 
import Firebase 
import FirebaseAuth 
import SwiftKeychainWrapper 

fileprivate struct RegisterInfo 
{ 
let email: String 
let password: String 
} 

class SignInVC: UIViewController 
{ 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
} 

override func viewDidAppear(_ animated: Bool) 
{ 
    if User.currentUserId != nil 
    { 
     print("AUTH: USING EXISTING KEYCHAIN") 
     User.startTrackingCurrentUser() 
     //performSegue(withIdentifier: "ToFeed", sender: nil) 
    } 
    else 
    { 
     print("AUTH: NO EXSTING KEYCHAIN") 
    } 
} 

override func didReceiveMemoryWarning() 
{ 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    print("AUTH: Preparing for segue \(segue.identifier)") 

    if let registrationVC = segue.destination as? RegisterVC 
    { 
     print("AUTH: Found registration VC") 

     if let info = sender as? RegisterInfo 
     { 
      print("AUTH: Sending email (\(info.email)) and password (\(info.password.characters.count) chars) information: ") 
      registrationVC.setBaseInfo(email: info.email, password: info.password) 
     } 
    } 
} 

@IBAction func signInButtonPressed(_ sender: UIButton) 
{ 
    if let email = emailField.text, let password = passwordField.text 
    { 
     FIRAuth.auth()?.signIn(withEmail: email, password: password) 
     { 
      (user, error) in 

      if let error = error 
      { 
       // TODO: Handle other errors here as well 
       switch FIRAuthErrorCode(rawValue: error._code)! 
       { 
       case .errorCodeUserNotFound: 
        print("AUTH: USER NOT FOUND -> CREATING NEW USER") 
        print("AUTH: Sending email \(email) and password \(password.characters.count) characters") 
        self.performSegue(withIdentifier: "RegisterUser", sender: RegisterInfo(email: email, password: password)) 
       default: print("AUTH: ERROR IN EMAIL LOGIN \(error)") // TODO: Inform user 
       } 
      } 
      else 
      { 
       print("AUTH: EMAIL AUTH SUCCESSFUL") 
       User.currentUserId = user?.uid 
       User.startTrackingCurrentUser() 
       self.performSegue(withIdentifier: "ToFeed", sender: nil) 
      } 
     } 
    } 
    // TODO: Inform user that the field contents are missing 
} 


fileprivate func firebaseAuth(with credential: FIRAuthCredential) 
{ 
    if FIRAuth.auth() == nil 
    { 
     print("AUTH: NO AUTH SERVICE AVAILABLE") 
    } 

    FIRAuth.auth()?.signIn(with: credential) 
    { 
     (user, error) in 

     if let error = error 
     { 
      print("AUTH: UNABLE TO AUTHENTICATE TO FIREBASE") 
      print("AUTH: \(error)") 
     } 
     else 
     { 
      if let user = user 
      { 
       print("AUTH: SUCCESSFULLY AUTHENTICATED WITH FIREBASE") 

       // Updates current user data 
       var userName = "User" 
       var image: UIImage? 

       if let retrievedName = user.displayName 
       { 
        userName = retrievedName 
       } 
       if let retrievedImageUrl = user.photoURL 
       { 
        if let data = try? Data(contentsOf: retrievedImageUrl) 
        { 
         image = UIImage(data: data) 
        } 
       } 

       User.post(uid: user.uid, provider: user.providerID, userName: userName, image: image) 
       { 
        user in 

        User.currentUser = user 
        User.startTrackingCurrentUser() 

        self.performSegue(withIdentifier: "ToFeed", sender: nil) 
       } 
      } 
     } 
    } 
} 
} 

Чтобы отобразить мои данные в виде таблицы, я используя этот контроллер вида:

// 
// Feed.swift 
// MobileAppDemo 
// 
// Created by Mikko Hilpinen on 31.10.2016. 
// Copyright © 2016 Mikkomario. All rights reserved. 
// 

import UIKit 
import FirebaseAuth 
import FirebaseDatabase 
import FirebaseStorage 
import SwiftKeychainWrapper 
import SwiftyJSON 

var posts = [Post]() 
var selectedIndexPath: Int = 0 

class FeedVC: UIViewController, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITableViewDelegate { 

@IBOutlet weak var feedTableView: UITableView! 

private var readPosts: ObserveTask? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    feedTableView.dataSource = self 
    feedTableView.delegate = self 

    readPosts = Post.observeList(from: Post.parentReference.queryOrdered(byChild: Post.PROPERTY_CREATED)) { 
     observedPosts in 

     posts = observedPosts.reversed() 
     self.feedTableView.reloadData() 
    } 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = self.feedTableView.dequeueReusableCell(withIdentifier: "MessageCell")! as UITableViewCell 

    let imageView = cell.viewWithTag(1) as! UIImageView 
    let titleLabel = cell.viewWithTag(2) as! UILabel 

    titleLabel.text = posts[indexPath.row].title 
    titleLabel.numberOfLines = 0 

    Storage.getImage(with: posts[indexPath.row].imageUrl){ 
     postPic in 
     imageView.image = postPic 
    } 

    return cell 

} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    selectedIndexPath = indexPath.row 
    self.performSegue(withIdentifier: "push", sender: self) 
    self.feedTableView.reloadData() 
} 
} 

и, наконец, для моей камеры с:

// 
// MessageCell.swift 
// MobileAppDemo 
// 
// Created by Mikko Hilpinen on 31.10.2016. 
// Copyright © 2016 Mikkomario. All rights reserved. 
// 

import UIKit 
import FirebaseStorage 

class MessageCell: UITableViewCell 
{ 

@IBOutlet weak var messageImageView: UIImageView! 
@IBOutlet weak var messageTextView: UITextView! 
@IBOutlet weak var titleTextView: UITextView! 
@IBOutlet weak var linkbutton: UIButton! 


private var post: Post! 

func configureCell(tableView: UITableView, post: Post) 
{ 
    self.post = post 

    // Basic info 
    titleTextView.text = post.title 
    messageTextView.text = post.caption 

    // Post user 
    User.get(id: post.creatorId) 
    { 
     postCreator in 


    } 



    // Image 
    Storage.getImage(with: post.imageUrl) 
    { 
     postPic in 

     self.messageImageView.image = postPic 
     // Row height changes so table needs to be reset 
     tableView.beginUpdates() 
     tableView.endUpdates() 
    } 
} 
} 

Если у кого-нибудь есть подсказка, как я могу это достичь? Это будет невероятно :) :)

Спасибо большое!

ответ

0

С вашей базой данных Posts с queryOrdered(byChild:) добавьте queryEqual(toValue:) и сравните ее с User.currentUserId.

readPosts = Post.observeList(from: Post.parentReference 
             .queryOrdered(byChild: Post.PROPERTY_CREATED) 
             .queryEqual(toValue: User.currentUserId)) { 

    observedPosts in 

    posts = observedPosts.reversed() 
    self.feedTableView.reloadData() 
} 
+0

Спасибо, Хмм ... У меня есть данные из информации ячеек являются дисплей, как это. .. Но смешно, если я использую: readPosts = Post.observeList (от: Post.parentReference.queryOrdered (byChild:. "Творец") queryEqual (toValue: "o9epRntmZaNe2LdTUJV2g1zr54C2")) { observedPosts в сообщений = observPosts.reversed() self.feedTableView.reloadData() } } Помещая вручную значение идентификатора одного пользователя, с которым оно работает. , , как назвать значение динамическим способом, как вы думаете? – tibewww

+0

@tibewww Но вы сохраняете значение в 'User.currentUserId', тогда почему это не работает, попробуйте напечатать значение' User.currentUserId' и проверить его значение или нет? –

+0

как шарм да, спасибо !!! – tibewww

Смежные вопросы