gpt4 book ai didi

ios - 如何创建使用@syncronized 的 Objective-C 代码的线程安全 Swift 版本?

转载 作者:行者123 更新时间:2023-11-28 06:22:32 32 4
gpt4 key购买 nike

我正在尝试将一些 Objective-C 代码转换为 Swift。我发现了一些类似的问题:Swift equivalent to Objective-C Synchronizedobjc_sync_enter / objc_sync_exit not working with DISPATCH_QUEUE_PRIORITY_LOW ,但我对答案并不完全满意。许多答案建议 objc_sync_exitobjc_sync_enter,据我所知,它们是 Apple 框架的未记录实现细节,因此我不太愿意在我的生产应用程序中使用它们。

我尝试转换的具体代码涉及一个 NSDateFormatter,它可以通过多种方法访问:

@implementation NSDateFormatter (MyApp)
+ (NSDateFormatter *)MyAppDateFormatter
{
static NSDateFormatter *formatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
formatter = [[NSDateFormatter alloc] init];
});
return formatter;
}

+ (NSString *)stringFromDate:(NSDate *)date withDateFormat:(NSString *)dateFormat
{
NSDateFormatter *formatter = [NSDateFormatter MyAppDateFormatter];
NSString *dateString = nil;

@synchronized(formatter)
{
formatter.dateFormat = dateFormat;

dateString = [formatter stringFromDate:date];
}

return dateString;
}

+ (NSDate *)dateFromString:(NSString *)string
{
NSDateFormatter *formatter = [NSDateFormatter MyAppDateFormatter];

NSDate *date = nil;

@synchronized(formatter)
{
formatter.dateStyle = NSDateFormatterFullStyle;
date = [formatter dateFromString:string];
}

return date;
}
@end

在我的 swift 代码中,我将 MyAppDateFormatter 设为静态常量,在 Swift 中它会自动延迟初始化。

extension DateFormatter {
private static let myAppDateFormatter = DateFormatter()

static func string(from date: Date, with dateFormat: String) -> String {
let dateFormatter = DateFormatter.myAppDateFormatter
dateFormatter.dateFormat = dateFormat

return dateFormatter.string(from: date)
}

static func date(from string: String) -> Date? {
let dateFormatter = DateFormatter.myAppDateFormatter
dateFormatter.dateStyle = .full

return dateFormatter.date(from: string)
}
}

如何在 Swift 中重现 @synchronized 行为?将使用 GCD 函数添加 getter 和 setter 到 myAppDateFormatter,如所见 here工作?即使在设置 myAppDateFormatter 的属性时不会调用 set ,该答案中显示的技术也会起作用吗? (如果它是一个类实例,并且它的一个属性正在被更改,则不会调用属性的 setter。)

最佳答案

@synchronized 据说等同于 NSRecursiveLock。我相信在正确的范围内创建这样一个锁,并在与使用 @syncronized 相同的地方使用它,将它包装起来而不是调用 lock 和 unlock,是 Swift 中最直接的等价物。

关于ios - 如何创建使用@syncronized 的 Objective-C 代码的线程安全 Swift 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42931462/

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