【问题标题】:Realm in appdelegate.swift not working on other filesappdelegate.swift 中的领域无法处理其他文件
【发布时间】: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 的引用(您需要它的每个类的实例属性,或者如果您只在一个中使用它,则只是一个局部变量类中的函数)。
  • 谢谢!这真的很有帮助,并且回答了我的问题(并且总体上让我更好地理解!)

标签: ios swift realm swift4


【解决方案1】:

大卫牧师为我回答了这个问题..

对于任何来这里的菜鸟......

无论如何,您都不应该将其声明为全局变量,因为这会导致您的应用程序扩展出现问题,如果您这样做了,那么我所做的方式无论如何都不会正确!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多