Не удается получить канал социальных сетей для работы в firebase и swift - PullRequest
0 голосов
/ 01 августа 2020

Итак, я уже несколько дней пытаюсь заставить этот канал работать, и я просто в тупике. Я вызвал метод getData, чтобы попытаться получить список идентификаторов сообщений от пользователя, чтобы затем получить их данные и поместить их в канал. Однако, когда я запускаю код, канал оказывается пустым, однако данные выводятся на консоль после извлечения идентификатора сообщения. Итак, это не проблема с подключением или чем-то еще, это просто моя структура кода. Переменная "scope" - это начало основной c попытки разбивки данных на страницы, но на самом деле я просто пытаюсь заставить ее работать вообще в данный момент. Любая помощь приветствуется. Вот мой код:

//
//  ProfileFeedViewController.swift
//  Meditation
//
//  Created by Harper Chisari on 7/27/20.
//  Copyright © 2020 Harper Chisari. All rights reserved.
//

import UIKit
import Firebase
import FirebaseStorage
import FirebaseDatabase

var currentPA: Array<String> = []

class ProfileFeedViewController: UIViewController{

@IBOutlet var profileFeedTableView: UITableView!


var posts: [Post] = []

override func viewDidLoad() {
    super.viewDidLoad()
    let scope = 0
    
    posts = createArray(scope: scope)
    profileFeedTableView.reloadData()
    
    }
    
    
}
func createPostArray(scope: Int, uid: String) -> Array<String>{
    db.collection("users")
    .document(uid)
        .getDocument { (document, error) in
            
            // Check for error
            if error == nil {
                
                // Check that this document exists
                if document != nil && document!.exists {
                    
                    let documentData = document!.data()
                    
                    let postArray = documentData?["post id's"] as! Array<String>
                    print(postArray)
                    //if postArray.count >= 25 { currentPA = Array( postArray[0+scope*25...24+scope*25])} else {
                        currentPA = postArray
                    print(currentPA)
                    //    }
                    
                } else {
                    print("huh?")
                }
            
                
            }else{
                print(error!)
                }}
    /*db.collection("users")
        .document(uid)
                .getDocument { (document, error) in
                
                // Check for error
                if error == nil {
                    
                    // Check that this document exists
                    if document != nil && document!.exists {
                        
                        let documentData = document!.data()
                        
                        let postArray = documentData?["post id's"] as! Array<String>
                        print(postArray)
                        //if postArray.count >= 25 { currentPA = Array( postArray[0+scope*25...24+scope*25])} else {
                            currentPA = postArray
                        print(currentPA)
                        //    }
                        
                    } else {
                        print("huh?")
                    }
                
                    
                }else{
                    print(error!)
                    }}*/
    print("ye")
    print(currentPA)
    return currentPA
}



func createArray(scope: Int) -> [Post] {
    var tempPosts: [Post] = []
    let currentPA = createPostArray(scope: scope, uid: uid)
    print("listen")
    print(currentPA)
    print("hey")
    for i in currentPA {
        print(i)
        db.collection("posts")
                    .document(i)
                    .getDocument { (document, error) in
                    
                    // Check for error
                    if error == nil {
                        
                        // Check that this document exists
                        if document != nil && document!.exists {
                            
                            let documentData = document!.data()
                            let postText = documentData?["post text"]
                            let postUser = documentData?["uid"]
                            Storage.storage().reference().child("posts").child("\(i)_post_image.png")
                                .getData(maxSize: 10*1024*1024, completion: {(data, error) -> Void in
                                if error != nil {
                                    print("oh no, the following error occured: \(String(describing: error))")
                                } else {
                                    let image : UIImage = UIImage(data: data!)!
                                    //uid
                                    
                                    db.collection("users")
                                        .document(postUser as! String)
                                             .getDocument { (document, error) in
                                             
                                             // Check for error
                                             if error == nil {
                                                 
                                                 // Check that this document exists
                                                 if document != nil && document!.exists {
                                                     
                                                     let documentData = document!.data()
                                                    let username = documentData?["username"]
                                                    let postImage = image
                                                    tempPosts.append(Post(image: postImage, username: username as! String, textcontent: postText as! String))
                                                }}}
                                    
                                    
                                    }})
                            
                            
                            
                        }} else {
                        print(error)
                        }}
    }
    //let post1 = Post(image: #imageLiteral(resourceName: "BANNER.png"), username: "banncer", textcontent: "penis")
   // let post2 = Post(image: #imageLiteral(resourceName: "BANNER.png"), username: "banncer", textcontent: "wenis")
    
   // tempPosts.append(post1)
    //tempPosts.append(post2)
    return tempPosts
}






extension ProfileFeedViewController: UITableViewDataSource, UITableViewDelegate {

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let post = posts[indexPath.row]
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "posterCell") as! postCell
    
    cell.setPost(post: post)
    
    return cell
}

}

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Ваше tableview использует var posts: [Post] = [] в качестве источника данных, но после получения результатов вы никогда не устанавливаете результаты в массив сообщений или не перезагружаете свой tableview profileFeedTableView.reloadData()

И, как всегда, удваивайте Убедитесь, что у вас есть источник данных tableView и набор делегатов.

Вы вызываете reload tableView в viewDidLoad до того, как документы будут загружены. Вам нужно вызвать перезагрузку только после того, как все данные будут загружены и ваши модели созданы. Так что назовите его в конце createArray .

0 голосов
/ 01 августа 2020

Обновите вашу перезагрузку / пакетное обновление вашего tableView после того, как данные были установлены. В вашей реализации вы вызываете reloadData в viewDidLoad, что не гарантирует, что функция, вызывающая Firebase, будет выполнена / завершена. Вы должны перезагружать данные только тогда, когда вы приближаетесь к завершению из Firebase. Также в вашей реализации источника данных tableView вы используете массив сообщений, который, кажется, никогда не устанавливается даже после получения данных из firebase. Я взял часть вашего фрагмента кода и добавил простое исправление. Проверьте код ниже.

func createArray(scope: Int) -> [Post] {
    var tempPosts: [Post] = []
    let currentPA = createPostArray(scope: scope, uid: uid)
 for i in currentPA {
// -------
}

// At the end of your loop you should set the posts and reload your tableView
self.posts = tempPosts
DispatchQueue.main.async {
self.profileFeedTableView.reloadData()
}


} // end of createArray function
    

...