【问题标题】:How to create a non-atomic global or static variable in Swift如何在 Swift 中创建非原子全局或静态变量
【发布时间】:2015-08-20 21:55:52
【问题描述】:

通常我需要缓存一个值以便在一个类的多个实例中重用它,例如:

class Session {
    typealias T = Session

    let chatId: Int64
    let userId: Int64
    var name = ""
    var url = ""

    // ------- Define schema helpers --------
    // The problem: access to them is dispatch_once-d.
    static let table = Table("Session")
    static let chatIdColumn = Expression<Int64>("ChatId")
    static let userIdColumn = Expression<Int64>("UserId")
    static let nameColumn = Expression<String>("Name")
    static let urlColumn = Expression<String>("Url")

    init() {
        ...
        // ------ They're used in constructor: ------
        guard let chat = db.pluckItem(T.table, T.chatIdColumn, chatId)
            else { return }

        userId = wish[T.userIdColumn]
        name = wish[T.nameColumn]
        url = wish[T.urlColumn]
    }

    func save() throws {
        // ------ They're also used when saving the object back to DB ------
        ...
        try db.upsert(T.table, T.wishIdColumn, wishId, setters:
            T.userIdColumn <- userId,
            T.nameColumn <- name,
            T.urlColumn <- url
    )

    func other() {
        // ------ Sometimes they're used in other methods of the class ------
    }
}

静态和全局变量使用 dispatch_once 以原子方式延迟初始化,因此访问它们会产生一些开销。 (请参阅 Jckarter 在https://devforums.apple.com/thread/229436 上的回复)

有没有办法以非原子方式缓存值?在大多数情况下,我不需要线程安全,变量在类实现内部使用。

简单地声明非静态实例变量不是一种选择,因为该值的计算成本可能很高,或者太大而无法存储在每个类实例中。

当然,我可以为这些共享属性创建一个单独的类,并将对它的引用存储在每个对象的成员变量中,但这会不必要地使实现复杂化并增加内存开销。

【问题讨论】:

  • 请定义太大而无法存储在每个类实例中!您认为您需要解决的具体问题是什么?
  • 在你的情况下,我会使用NSUserDefaults
  • @der_michael,我已经用更详细的示例代码更新了这个问题。但是这个问题并不是严格意义上的 ORM 相关的。当对象很小但有很多对象时,添加额外字段会显着增加内存使用量。
  • @nikita-zernov,我相信使用 NSUserDefaults 会比 dispatch_once-d static var 慢得多。

标签: multithreading swift static global-variables swift2


【解决方案1】:

阅读:https://mikeash.com/pyblog/friday-qa-2014-06-06-secrets-of-dispatch_once.html

那篇文章深入探讨了dispatch_once 的实现,并将其性能与非线程安全等效项的性能进行了比较。结论是在初始写入变量后,后续读取变量没有开销。

因此,我认为你应该把时间花在其他地方。 :-)

【讨论】:

  • 我同意。这闻起来很像问题实际上出在其他地方
  • @der_michael 我不认为 OP 实际上有性能问题;我认为这更像是过早优化的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 2011-01-05
  • 2011-05-24
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多