gpt4 book ai didi

multithreading - 如何在 Swift 中创建非原子全局或静态变量

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:26 25 4
gpt4 key购买 nike

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

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 上的回复)

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

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

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

最佳答案

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

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

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

关于multithreading - 如何在 Swift 中创建非原子全局或静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32129056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com