Ios 如何初始化在其init()中的闭包中分配给self的对象?

Ios 如何初始化在其init()中的闭包中分配给self的对象?,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我有一个围绕Firebase数据库的数据库包装类,我想缓存Firebase快照,因此我有以下代码: @objc final class Database : NSObject { var spamRef: FIRDatabaseReference! = nil var snapshot:FIRDataSnapshot? = nil override init() { FIRDatabase.database().persistenc

我有一个围绕Firebase数据库的数据库包装类,我想缓存Firebase快照,因此我有以下代码:

@objc final class Database : NSObject
{
    var spamRef: FIRDatabaseReference!  = nil
    var snapshot:FIRDataSnapshot?       = nil

    override init()
    {
        FIRDatabase.database().persistenceEnabled = true
        FIRApp.configure()
        spamRef = FIRDatabase.database().reference(withPath: "spam_list")
        _ = spamRef.observe(FIRDataEventType.value, with: { (theSnapshot) in
            self.snapshot = theSnapshot
            ...
这会导致“在初始化所有成员之前由闭包自行捕获”

我知道错误的含义和原因;我的问题是什么是一个优雅的解决方案来修复它

如果我将闭包移出init()并放入一个单独的函数中,在init完成后调用该函数,那么仍然需要调用该单独的函数。 如果它是由创建数据库对象的代码显式调用的,那么我不认为这是一个好的解决方案——调用代码现在已经暴露了实现的内部结构和这个函数需要调用的责任。 init()方法当然不能直接调用此方法,但它可以安排在微秒延迟后调用函数(因此运行循环将完成,init()将在调用新函数之前完成)。 但这看起来很笨重


什么是优雅的解决方案?

首先调用
super.init()
?在
init()
中不能有异步调用。使用optionals或lazy var访问快照的内容。在这里可以看到一个类似的问题:@JAL我不想使用lazy,因为我希望快照在应用程序启动后被初始化并准备好使用,因为它是一个非常大的数据集,可能需要几秒钟的时间,所以当它被访问时,它立即可用,因此可以通过调用代码同步访问。@dan。行得通,谢谢。但是首先调用super.init()实际上是如何解决这个问题的呢?首先调用
super.init()
?在
init()
中不能有异步调用。使用optionals或lazy var访问快照的内容。在这里可以看到一个类似的问题:@JAL我不想使用lazy,因为我希望快照在应用程序启动后被初始化并准备好使用,因为它是一个非常大的数据集,可能需要几秒钟的时间,所以当它被访问时,它立即可用,因此可以通过调用代码同步访问。@dan。行得通,谢谢。但是首先调用super.init()实际上是如何解决这个问题的呢?