0

我有一个viewcontroller显示一些使用tableview和单元格的帖子。所有数据都是从Firebase(数据库和用户)获取的。仅从当前用户登录显示来自TableView的帖子

我有一个登录屏幕才能到达feedview。

我想只显示该桌面视图控制器中当前用户登录的盆。这怎么可能?

我的数据库是建立这样的:

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() 
} 
} 

终于为我的单元格s:

// 
// 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在 职位= observedPosts.reversed() self.feedTableView.reloadData() } } 通过手动将其工作的一个用户ID的值。 。 。如何以动态的方式调用价值,你觉得呢? – tibewww

+0

@tibewww但是你将值存储在'User.currentUserId'中,那么为什么不工作,试着打印'User.currentUserId'的值并检查它是否有值? –

+0

喜欢的魅力是的,谢谢! – tibewww

相关问题