gpt4 book ai didi

ios - 在惰性变量中使用 dispatch_once 或静态变量

转载 作者:搜寻专家 更新时间:2023-10-31 22:21:17 24 4
gpt4 key购买 nike

来自Swift guide :

If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there is no guarantee that the property will be initialized only once.

所以,据我所知,使用

class SomeClass {
lazy var someVar: SomeOtherClass = {
return SomeOtherClass()
}()
}

不是确保使用 SomeClass 实例的每个人都使用与 SomeClass().someVar 相同的 SomeOtherClass 实例的线程安全方法。

如果是这样,就是使用

class SomeClass {
lazy var someVarr: SomeOtherClass = {
var some: SomeOtherClass? = nil
var token: dispatch_once_t = 0
dispatch_once(&token) {
some = SomeOtherClass()
}
return some!
}()
}

或使用:

class SomeClass {
lazy var someVarrr: SomeOtherClass = {
struct Static {
static let some = SomeOtherClass()
}
return Static.some
}()
}

实例化 SomeOtherClass 的正确、线程安全的方法?

为了提供一些上下文:在 Objective-C 中,我使用了:

-(NSURLSession *)ephemeralURLSession {
if (!_ephemeralURLSession) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
_ephemeralURLSession = [NSURLSession sessionWithConfiguration:configuration];
});
}
return _ephemeralURLSession;
}

现在我想知道在 Swift 中实例化 NSURLSession 的正确方法是什么,例如:

lazy var ephemeralURLSession: NSURLSession = {
var session: NSURLSession? = nil
var token: dispatch_once_t = 0
dispatch_once(&token) {
let configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
session = NSURLSession(configuration: configuration)
}
return session!
}()

最佳答案

你可以这样定义它:

static let ephemeralURLSession: NSURLSession = {
let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
return NSURLSession(configuration: configuration)
}()

这既是惰性的又是线程安全的。

关于ios - 在惰性变量中使用 dispatch_once 或静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35793445/

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