我已经开始为一个简单的App开发后端,并且已经建立了一个数据库类(名为DBDelegate
),所有文件都将与之通信。
在我的AppDelegate.swift
中,我有这个:
static public var dbDelegate:DBDelegate = DBDelegate()
private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
FirebaseApp.configure()
return true
}
它是static public
,因此我可以从其他文件访问dbDelegate
。
在我的其他文件中,我有以下几点可提高可读性:(因为它是一个类,因此将通过引用传递)
let dbDelegate = AppDelegate.dbDelegate
在我的DBDelegate
班上:
var db = Firestore.firestore()
init() {
FirebaseApp.configure()
}
构建代码时,它会正常运行。
运行时,该应用会立即以SIGABRT
崩溃。
错误消息是:
Terminating app due to uncaught exception 'FIRAppNotConfiguredException', reason: 'Failed to get FirebaseApp instance. Please call FirebaseApp.configure() before using Firestore'
DBDelegate
类的init函数上设置一个断点。它没有达到断点。dbDelegate
变量lazy
:
lazy must not be used on an already-lazy global
static public var dbDelegate:DBDelegate! private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. FirebaseApp.configure() dbDelegate = DBDelegate() return true }
Static member 'dbDelegate' cannot be used on instance of type 'AppDelegate'
任何帮助都会很棒!
编辑:我找到了一个麻烦的解决方案,请参见下文。
答案 0 :(得分:2)
最好为Firebase创建一个单例。
class FirebaseService: NSObject {
static let shared = FirebaseService()
init() {
FirebaseApp.configure()
}
}
然后,您可以通过以下共享方式访问所有内容:
FirebaseService.shared.methodName
要在应用程序委托中进行配置,您需要按以下方式调用它:
_ = FirebaseService.shared
答案 1 :(得分:1)
首先,我要感谢@DionzB建议使用单例(我这样做了)。我将在此答案中引用他/她的帖子。
好吧,所以经过一些研究并使用了断点,我发现我的自定义类实际上在AppDelegate之前执行。知道这一点后,我在以下行之前创建了一个变量:
static let shared = FirebaseService()
名称无关紧要,因为我/您不会调用它,并将其分配给FirebaseApp.configure()
FirebaseService类变为:
class FirebaseService: NSObject {
let constantToNeverTouch = FirebaseApp.configure()
static let shared = FirebaseService()
init() {
}
}
接下来,您必须确保FirebaseApp.configure()在代码中的其他位置都不存在。它也不应该在AppDelegate中。拥有多个FirebaseApp.configure()会使应用程序崩溃。
答案 2 :(得分:0)
可能是您的代码顺序错误。确保将窗口代码放在firebaseApp.configure之后,而不是之前。在firebaseApp.configure连接之后,我只是放置了窗口创建代码(窗口= UIWindow(frame:UIScreen.main.bounds等),直到遇到了同样的崩溃。只是交换了它们的位置:
FirebaseApp.configure()
let db = Firestore.firestore()
let settings = db.settings
settings.areTimestampsInSnapshotsEnabled = true
db.settings = settings
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = HomeController()
window?.makeKeyAndVisible()
答案 3 :(得分:0)
让dbDelegate = AppDelegate.dbDelegate
在您的DBDelegate类中:
var db : Firestore?
init() {
FirebaseApp.configure()
db = Firestore.firestore()
}
答案 4 :(得分:0)
您可以使用FirebaseApp.configure()覆盖AppDelegate的init方法,并确保在创建任何窗口之前将其加载。
override init() {
FirebaseApp.configure()
}
答案 5 :(得分:0)
我遇到了同样的问题,因为我的 pod 版本太旧了。所以解决方案是
使用命令 $data=array(
'email' => $email ?? null,
'mobileno'=>$mobileno ?? null,
'password' => $newpassword,
'account_type' => $account_type,
);
检查您的 Pod
如果 pod 版本旧或不一样,CocoaPods 需要更新。使用评论 pod --version
完成后,您需要再次检查您的 pod,使用命令 sudo gem install CocoaPods
确保您的 pod 版本已升级
pod --version
到您的项目目录,然后使用命令 cd
命令完成后使用 pod deintegrate
打开您的项目工作区,构建并运行