Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将两个不同的数组加载到tableview(Swift)_Arrays_Swift_Firebase_Uitableview_Swift5 - Fatal编程技术网

Arrays 将两个不同的数组加载到tableview(Swift)

Arrays 将两个不同的数组加载到tableview(Swift),arrays,swift,firebase,uitableview,swift5,Arrays,Swift,Firebase,Uitableview,Swift5,我有两个函数,一个用于获取我所有的帖子,另一个用于获取我正在使用Firebase拉取的来宾帖子。我希望将这两个函数合并到我的tableview中。最好的方法是什么 var postArray = [Post]() //main array that feeds into tableview var myArray = [Post]() var guestArray = [Post]() var DatabaseConnect = AuthenticationService() private

我有两个函数,一个用于获取我所有的帖子,另一个用于获取我正在使用Firebase拉取的来宾帖子。我希望将这两个函数合并到我的tableview中。最好的方法是什么

var postArray = [Post]() //main array that feeds into tableview
var myArray = [Post]()
var guestArray = [Post]()
var DatabaseConnect = AuthenticationService()

private func fetchAllPosts() {
    self.DatabaseConnect.fetchMyPosts {(myposts) in
        self.DatabaseConnect.fetchGuestPosts {(posts) in
            self.myArray = myposts
            self.guestArray = posts
            self.postArray = self.myArray + self.guestArray
            self.tableView.reloadData()
        }
    }
}

这是你如何使它更好

  • 不要在不需要的地方使用
    self
    。例如:
    self.DatabaseConnect
  • 对不相关的同时API调用使用DispatchGroup()
  • 不要使用不必要的变量
    myArray
    guestArray
    仅用于附加到主数组为什么不直接附加它
  • 使用
    [弱自我]
    [无主自我]
    执行同步后台任务
  • 代码如下:

    var postArray = [Post]() //main array that feeds into tableview
    var DatabaseConnect = AuthenticationService()
    
    private func fetchAllPosts() {
        let group = DispatchGroup()
        postArray = []
    
        group.enter()
        DatabaseConnect.fetchMyPosts { [weak self] myposts in
            self?.postArray.append(contentsOf: myposts)
            group.leave()
        }
    
        group.enter()
        DatabaseConnect.fetchGuestPosts { [weak self] guestPosts in
            self?.postArray.append(contentsOf: guestPosts)
            group.leave()
        }
    
        group.notify(queue: .main) {
            self.tableView.reloadData()
        }
    }
    

    为什么不重新加载tableview两次:

       private func fetchAllPosts() {
            self.DatabaseConnect.fetchMyPosts {(myposts) in
                self.postArray.append(myposts)
                self.tableView.reloadData()
            }
            self.DatabaseConnect.fetchGuestPosts {(guestPosts) in
                self.postArray.append(guestPosts)
                self.tableView.reloadData()
            }
        }
    

    非常感谢。但它似乎不起作用。一旦点击group.leave,postArray看起来就清晰了。我做了一些编辑,添加了一些我遗漏的东西。再检查一遍,还是不行。当我在第一个group.leave之后打印postArray时,它会显示,但当我在第二个group.leave之后打印postArray时,第一个fetchMyPosts数组不会显示。请尝试使用断点了解工作流程,并在
    leave()之前使用print语句
    之后没有。因为我想能够在之后按日期对帖子进行排序-有办法吗?您的原始代码也没有对帖子进行排序。。Post中是否有日期变量?您是否编写了任何排序代码?是的,我计划添加self.postArray.sort{$0.postDate>$1.postDate},但不知道在代码中放在哪里。如果在第二次postArray之后添加排序,则初始加载不会同时对MyPost和GuestPost进行排序,只会对GuestPost进行排序。请在每次重新加载数据之前尝试添加两次排序。它应该是self.postArray=self.postArray.sort{$0.postDate>$1.postDate}问题是我们不知道DatabaseConnect是做什么的,这个问题有点模糊。我们也不知道您是否使用RTDB或Firestore。听起来像是从Firebase加载数据并填充数组,然后从Firebase读取更多数据并将其附加到数组中。但这并不清楚。我们也不清楚这些类数组变量都有哪些,但实际上并没有将它们用作类变量。你能澄清这个问题并解释代码在做什么吗?