当前位置: 首页 > 知识库问答 >
问题:

Swift等同于Objective-C的“@synchronized”是什么?

谈阎宝
2023-03-14

我搜了Swift的书,找不到@同步的Swift版本,请问在Swift中如何进行互斥?

共有3个答案

吕博耘
2023-03-14

我喜欢并使用这里的许多答案,所以我会选择最适合您的答案。也就是说,当我需要像客观c这样的东西时,我更喜欢的方法@synchronized使用 swift 2 中引入的 defer 语句。

{ 
    objc_sync_enter(lock)
    defer { objc_sync_exit(lock) }

    //
    // code of critical section goes here
    //

} // <-- lock released when this block is exited

这种方法的好处在于,您的临界区可以以任何期望的方式退出包含块(例如,< code>return 、< code>break 、< code>continue 、< code>throw),并且“无论程序控制如何转移,defer语句中的语句都会被执行。”一

阮才俊
2023-03-14

我自己一直在寻找这个,并得出结论,Swift内部还没有原生结构。

我确实根据Matt Bridges和其他人的一些代码编写了这个小助手函数。

func synced(_ lock: Any, closure: () -> ()) {
    objc_sync_enter(lock)
    closure()
    objc_sync_exit(lock)
}

用法非常简单

synced(self) {
    println("This is a synchronized closure")
}

我发现了一个问题。在这一点上,作为lock参数传入数组似乎会导致非常迟钝的编译器错误。否则,尽管它似乎按预期工作。

Bitcast requires both operands to be pointer or neither
  %26 = bitcast i64 %25 to %objc_object*, !dbg !378
LLVM ERROR: Broken function found, compilation aborted!
戚俊健
2023-03-14

您可以使用 GCD。它比@synchronized更冗长,但可以作为替代品:

let serialQueue = DispatchQueue(label: "com.test.mySerialQueue")
serialQueue.sync {
    // code
}
 类似资料:
  • 问题内容: 我已经搜索过Swift书,但是找不到@synchronized的Swift版本。如何在Swift中进行互斥? 问题答案: 您可以使用GCD。它比更加冗长,但可以代替:

  • 问题内容: 我想知道它们是否在JAVA的方法“ BeanUtils.CopyProperties(bean1,Bean2);”的目标C中具有等效项。? 或其他解决方案,我想将motherObject强制转换为childObject: 在第一个测试中,它可以正常工作,但是我有一个警告:“不兼容的指针类型返回…”; 我使用WSDL2Objc并生成Bean,并且其名称可以在2代之间更改:-/ 我更喜欢与

  • 问题内容: 我目前正在一个主要是Objective-C的项目中编写一些Swift代码。在我们的ObjC代码中,我们有一个声明为的标头。然后,我们可以声明一个@property,它只能是实现的子类。 (注意:并且不是我定义的;它们是GPUImage库的一部分) 即使标头是在导入的标头中#import的,我们的Swift代码似乎也无法识别这一点。我试图在Swift中复制声明,但是这些都不是正确的语法:

  • 问题内容: 我已经用谷歌搜索,但无法找出什么是等效的。 这是我唯一能找到的(Swift的替代方法responsesToSelector:),但在我的情况下并没有太大意义,因为它检查了委托的存在,我没有委托,我只想检查是否存在新的API在设备上运行时是否返回,如果不是,则返回原先的api版本。 问题答案: 如前所述,在 大多数情况下,您可以使用可选的unwrapper运算符来实现所需的功能。这样,当

  • 问题内容: 下面的Objective-C代码等效于Swift代码。我找不到带有运行时概念的快速主题。 试图获取类的对象? 更新: 尝试以下代码,出现错误 问题答案: 首先,在不知道您在Objective-C中使用该类对象的目的的情况下,很难将该代码转换为Swift。 在Objective-C中,类对象是对象,并且类型可以保存指向任何类对象的指针。但是,当将Objective-C API桥接到Swi

  • 在Swift中,转义闭包参数用注释。Objective-C中是否有任何等效项,以便生成的Swift接口将标记为?