如何在Firebase iOS SDK v4中正确扩展DatabaseReference

如何在Firebase iOS SDK v4中正确扩展DatabaseReference,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我有一个应用程序,最初是在Swift 2/Xcode 7.3.1中使用开发的,目前正在更新为最新版本的Swift/Xcode,这也需要更新Firebase SDK 我们已经开发了数百个单元测试,它们大部分都很容易更新,但有一些特别棘手,因为它们的结构(以及如何使用) 最初,由于几乎所有Firebase数据库功能都包含在一个“Firebase”类中,因此我们创建了一个自定义类,该类继承自Firebase类,该类覆盖了多个方法。在最新的SDK中,功能被进一步划分为不同的类(即数据库和数据库引用的独立

我有一个应用程序,最初是在Swift 2/Xcode 7.3.1中使用开发的,目前正在更新为最新版本的Swift/Xcode,这也需要更新Firebase SDK

我们已经开发了数百个单元测试,它们大部分都很容易更新,但有一些特别棘手,因为它们的结构(以及如何使用)

最初,由于几乎所有Firebase数据库功能都包含在一个“Firebase”类中,因此我们创建了一个自定义类,该类继承自Firebase类,该类覆盖了多个方法。在最新的SDK中,功能被进一步划分为不同的类(即
数据库
数据库引用
的独立类),并且被覆盖的大多数方法现在都是FirebaseDatabase框架中DatabaseReference类的一部分

让这更具体一点

旧代码:

class FirebaseTest: Firebase {

    override func childByAutoId() {
        //generate and save Auto ID internally to be used later for testing/validation

        super.childByAutoID();
    }

    //many other overridden methods
}

//Unit tests
let fbref = FirebaseTest(url: "my-firebase.firebaseio.com/test");
// etc
旧的Firebase SDK将返回对构造函数中提供的基本URL的Firebase引用,因为我们使用的许多属性都是Firebase的成员,所以我们的所有测试都有效

遵循SDK迁移指南,我最终得到以下代码(只需将Firebase替换为DatabaseReference):

现在,上面的代码立即出现了一个问题,使其无法编译:DatabaseReference构造函数不接受任何参数。我可以将其更改为以下内容

let fbref = FirebaseTest();
但现在我知道,虽然它会编译,但测试绝对会失败。最棘手的部分是,在最新的SDK中,如下所示:

//don't do this!
let fbref = DatabaseReference(); //will compile, but will break at runtime. Upon inspection in the debugger, there are several internal properties that should be set that are null. Those internal properties are likely all set correctly if the database reference is obtained correctly

//do it one of these ways
let fbref2 = Database.database().reference();
let fbref3 = Database.database().reference(fromUrl: "my-firebase.firebaseio.com/test") //also have access to this "reference(fromUrl: )" method from Database.database()
let fbref4 = Database.database().reference(withPath: "/test") //also have access to this "reference(withPath: )" method from Database.database()
class FirebaseTest: DatabaseReference {
    override func childByAutoId() {
        //generate and save Auto ID internally to be used later for testing/validation

        super.childByAutoID();
    }

    //many other overridden methods
}

class FirebaseDatabaseTest: Database {
    override func reference(fromUrl: String) {
        return FirebaseTest();
    }
}

let fbref = FirebaseDatabaseTest().reference(fromUrl: "my-firebase.firebaseio.com/test")
所以,希望我的难题变得清晰起来——因为我只能从数据库中检索正确初始化的DatabaseReference,而不是覆盖了测试方法的DatabaseReference版本,所以我被卡住了

此外,我还研究了创建
数据库本身的扩展,如下所示:

//don't do this!
let fbref = DatabaseReference(); //will compile, but will break at runtime. Upon inspection in the debugger, there are several internal properties that should be set that are null. Those internal properties are likely all set correctly if the database reference is obtained correctly

//do it one of these ways
let fbref2 = Database.database().reference();
let fbref3 = Database.database().reference(fromUrl: "my-firebase.firebaseio.com/test") //also have access to this "reference(fromUrl: )" method from Database.database()
let fbref4 = Database.database().reference(withPath: "/test") //also have access to this "reference(withPath: )" method from Database.database()
class FirebaseTest: DatabaseReference {
    override func childByAutoId() {
        //generate and save Auto ID internally to be used later for testing/validation

        super.childByAutoID();
    }

    //many other overridden methods
}

class FirebaseDatabaseTest: Database {
    override func reference(fromUrl: String) {
        return FirebaseTest();
    }
}

let fbref = FirebaseDatabaseTest().reference(fromUrl: "my-firebase.firebaseio.com/test")
但是,即使我在重写的
reference
方法中拦截url,也没有明确的方法可以使用该url以正确的方式“设置”数据库引用


想法?

嗨,你有什么解决办法吗?不幸的是,没有☹️ 由于应用程序本身正在从Firebase移开,所以它的优先级降低了,但就我个人而言,我仍然希望看到一个解决方案!那太不幸了。不过,还是要谢谢你的回复。如果我发现了什么,我一定会把它作为答案贴在这里。