【发布时间】:2018-04-11 12:41:01
【问题描述】:
这可能是一个简单的,但我在这里做错了什么:
我的 appdelegate.swift 中有这个:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//configure Firebase
FirebaseApp.configure()
let realm = try! Realm()
return true
}
然后我想在我的视图控制器文件中使用引用它,如下所示:
do {
try realm.write {
realm.add(workoutData)
}
} catch {
print("Sorry no good")
}
但它说“使用未解析的标识符‘领域’”。
但我认为添加应用程序委托的目的是让您无需执行“让领域 = 尝试! Realm()' 在每个视图控制器上?
我有一个在 appdelegate 中配置的 firebase 实例:
FirebaseApp.configure()
而且效果很好。
我在这里遗漏了什么吗?我基本上找不到涵盖此问题的另一个答案(有一些与迁移等有关),所以我假设这非常简单!
【问题讨论】:
-
您在 AppDelegate.swift 文件中究竟在哪里声明了
realm?很可能您在类中将其声明为实例属性而不是全局变量。顺便说一句,保持对 Realm 的全局引用是一个坏主意,原因有几个(除了不使用全局变量的常见原因之外,Realm是线程安全的,因此保持对它的全局引用很容易导致线程问题),所以你不应该这样做只是为了让你不必创建对Realm实例的新引用。 -
感谢我更新了代码 sn-p 以显示它的位置 - 好吧,这完全有道理 - 所以我应该总是在任何需要它的视图控制器中声明领域实例?我不知道谢谢!
-
该声明完全错误。这甚至不是您的应用程序委托类的实例属性,而是声明它的函数内部的局部变量。正如我已经说过的,您可以创建一个全局变量(在任何类/类型声明之外创建它),但是迟早会导致线程问题,所以是的,我建议以较小的范围创建对
Realm的引用(您需要它的每个类的实例属性,或者如果您只在一个中使用它,则只是一个局部变量类中的函数)。 -
谢谢!这真的很有帮助,并且回答了我的问题(并且总体上让我更好地理解!)