Swift I';我们在void函数错误中获得意外的非void返回值?

Swift I';我们在void函数错误中获得意外的非void返回值?,swift,firebase,firebase-realtime-database,switch-statement,Swift,Firebase,Firebase Realtime Database,Switch Statement,var语句的重新声明 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { switch section { case 0: 从数据库收集信息 one = Database.database().reference() 出现错误的地方 one.child("users").child("pr

var语句的重新声明

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    switch section {
    case 0:
从数据库收集信息

        one = Database.database().reference()
出现错误的地方

        one.child("users").child("profile").observe(.value, with: {(snapshot) in
            let num = snapshot.childrenCount

您要传递给观察的此函数类型为返回void的函数:

            return Int(num)
        })
    default:
        return 0
    }

}
您可以从API文档中看到:

声明

{(snapshot) in
    let num = snapshot.childrenCount
    return Int(num)
})
函数的类型是
(DataSnapshot)->Void
,这意味着它不能返回值。但是您将返回
Int(num)


您将无法从collectionView()返回数据库查询的结果,因为数据库观察者是异步的,并且会立即返回。它将在一段时间后为您提供一个值,您无法保证需要多长时间。

您要传递给observe的此函数被键入为返回void的函数:

            return Int(num)
        })
    default:
        return 0
    }

}
您可以从API文档中看到:

声明

{(snapshot) in
    let num = snapshot.childrenCount
    return Int(num)
})
函数的类型是
(DataSnapshot)->Void
,这意味着它不能返回值。但是您将返回
Int(num)


您将无法从collectionView()返回数据库查询的结果,因为数据库观察者是异步的,并且会立即返回。一段时间后它会给你一个值,你无法保证需要多长时间。

道格·史蒂文森是对的

相反,您可以在从服务器获取数据后,解析数据并将其保存到变量中,然后更新collectionView

func observe(_ eventType: DataEventType, with block: @escaping (DataSnapshot) -> Void) -> UInt

道格·史蒂文森是对的

相反,您可以在从服务器获取数据后,解析数据并将其保存到变量中,然后更新collectionView

func observe(_ eventType: DataEventType, with block: @escaping (DataSnapshot) -> Void) -> UInt

一般来说,您不能从Firebase闭包返回值,因为它们不是函数,而直接从Firebase(通过internet)维护tableView的尝试将非常缓慢。请参阅下面的注释。是否确实要读取/users/profile中的所有节点?一般来说,为单个用户获取数据需要/users/uid/profile。一般来说,您不能从Firebase闭包返回值,因为这些值不是函数,如果您试图直接从Firebase(通过internet)维护tableView,则会变得很滞后。请参阅下面的注释。是否确实要读取/users/profile中的所有节点?通常情况下,为单个用户获取数据需要/users/uid/profile。请注意,不需要DispatchQueue,因为Firebase闭包中的UI调用是在主线程上执行的,没有理由填充tempArray-可以直接填充类级别的self.data数组。您可能希望将此代码调整为.observeSingleEvent as.value,以便让节点上的观察者监视更改,而OP似乎只想获取一次。请注意,不需要DispatchQueue,因为Firebase闭包中的UI调用是在主线程上执行的,并且没有理由填充tempArray-类级别self.data数组可以直接填充。您可能希望将此代码调整为.observeSingleEvent as.value,以便让节点上的观察者监视更改,而OP似乎只想获得一次。