为啥我的数组在附加值后返回 null 或显示一个空数组

Posted

技术标签:

【中文标题】为啥我的数组在附加值后返回 null 或显示一个空数组【英文标题】:Why does my array return null or show an empty array, after appending values to it为什么我的数组在附加值后返回 null 或显示一个空数组 【发布时间】:2021-12-28 22:08:36 【问题描述】:

我正在从 firebase 实时数据库中获取值。我想将这些值存储到一个数组中并在 UITableView 中显示它们。这是正在发生的事情:


我在 viewDidLoad() 函数之前定义了数组,如下所示:

var taskTitles: [Task] = [] 

在我的viewDidLoad() 函数中,我正在调用另一个函数来生成数组:

override func viewDidLoad() 
    super.viewDidLoad()
    
    //Setting the Title for the nav bar
    title = "To Do List"

    configureNavigationItems()

    taskTitles = createArray() // creating the array of tasks in db
    
    tableView.delegate = self
    tableView.dataSource = self
    
    
    


在这个函数中,我将信息传递给我的班级。任务和任务单元。他们只是在处理任务的标题。

    func createArray() -> [Task] 
        
        
        taskRef = Database.database().reference(withPath: "Tasks")
        
        //getting values from db, storing them in an array.
        refHandle = taskRef?.observe(DataEventType.value, with:  snapshot in
            for taskSnapshot in snapshot.children 
                let nodeA = taskSnapshot as! DataSnapshot
                let keyA = nodeA.key
                let theTask = Task(title: String(keyA))
                self.taskTitles.append(theTask)
                print("In the FOR Loop --> ", self.taskTitles)
            
            print("outside of FOR  Loop --> ", self.taskTitles)
        )
        print("outside of observe func --> ", taskTitles)
        
        return taskTitles
    
    

但是,它似乎没有将我的项目保存到数组中。我做了一些调试来确定哪里出了问题。希望下图可以澄清一下:


知道是什么问题吗?

【问题讨论】:

【参考方案1】:

您对taskRef?.observe 的调用是异步的。这就是为什么您会在其他行之前看到“outside of observe func --> []”。

发生的情况是您的createArray() 函数调用observe,然后返回仍然为空的taskTitles。然后您的视图完成加载并显示(可能)一个空表。在此之后observe 函数使用快照调用您的闭包并更新taskTitles,但此时tableView 已经在屏幕上并且为空,您必须采取进一步的操作来重新加载它(例如,打电话给reloadData())。

也许还值得一提的是,您正在修改该函数中的属性,然后将其返回,并将其分配给自身。这可能是多余的。

【讨论】:

如此简单的修复。谢谢你没有骂我,哈哈。 这是一个诚实的错误。请记住,大多数时候您必须将处理程序传递给这样的东西,它可能是异步的。 :)

以上是关于为啥我的数组在附加值后返回 null 或显示一个空数组的主要内容,如果未能解决你的问题,请参考以下文章

为啥阿波罗角查询返回空数组?

为啥 ContentProvider 在 App 更新后返回空游标?

Java中应该返回零长度数组或空集合,而不是返回null(转)

java 泛型函数需要返回Integer 我返回null 为啥报空指针异常

为啥我的数组列表即使在初始化后也会抛出空指针异常?

为啥 laravel 返回一个空数组来表示一个有很多关系?