我有一个名为MyClass的班级. 我想要做的是确保每次调用它的一个方法时,该方法总是在同一队列上被调用.

我正在努力确保我在MyClass中调用的每个方法都在同一队列中被调用.这是因为MyClass充当驱动我的应用程序的数据的访问点.任何时候,应用程序的任何部分需要获取或设置唯一的真理来源,它都会通过这个类.我想安全地防止任何访问或修改真相来源的并发问题.

我可以通过将每个调用包装在异步块中来做到这一点. 我正在寻找一种更优雅、更"笨重"的方式来实现这一点.

我的问题是,我如何才能在不必将每个方法调用包装在块中的情况下实现这一点?

class MyClass {
    static let queue = DispatchQueue(label: "myqueue",
                                     attributes: .concurrent)

    func functionSet1(value: String) {
    }

    func functionGet1() -> Bool {
        return true
    }

    func functionSet2(value: String) {
    }

    func functionGet2() -> Bool {
        return true
    }
}

class Invoker {
    let invokee: MyClass = MyClass()
    
    func call1() {
        MyClass.queue.sync {
            invokee.functionGet1()
        }
    }

    func call2() {
        MyClass.queue.sync {
            invokee.functionGet2()
        }
    }

    func call3() {
        MyClass.queue.sync {
            invokee.functionSet1(value: "value")
        }
    }

    func call1() {
        MyClass.queue.sync {
            invokee.functionSet1(value: "value")
        }
    }
}

推荐答案

正如Rob所说,这是使用actor的一个很好的例子. 尽管这些函数被标记为async,但执行是在参与者的线程上按顺序进行的,该执行者acts是一个串行队列.不管怎样,并发队列与您的需求相矛盾.

actor MyActor {
    func functionSet1(value: String) {
        print("functionSet1", value)
    }
    func functionGet1() -> Bool {
        print("functionGet1")
        return true
    }
    func functionSet2(value: String) {
        print("functionSet2", value)
    }
    func functionGet2() -> Bool {
        print("functionGet2")
        return true
    }
}

class Invoker {
    let invokee = MyActor()
    
    func call1() async  {
        await invokee.functionGet1()
    }
    func call2() async {
        await invokee.functionGet2()
    }
    func call3() async {
        await invokee.functionSet1(value: "value1")
    }
    func call4() async {
        await invokee.functionSet2(value: "value2")
    }
}

Task {
    let invoker = Invoker()
    await invoker.call1()
    await invoker.call2()
    await invoker.call3()
    await invoker.call4()
}

Swift相关问答推荐

通常从数组调用的SWIFT静态协议函数

UICollectionViewCompostionalLayout Collectionview单元格宽度在重新加载数据后未正确调整大小

可以';t在标记为@Observable的类上使用属性包装

快速并行读取进程 standardOutput 和 standardError 而不会阻塞

Xcode创建GitHub仓库,但未推送所有文件

TextField 键入未完成

为 ObservedObject 和 State 对象配置预览

并发执行代码中捕获的 var 的变异

如何从另一个 swift 文件中调用函数

Swift-如何接受多个(联合)类型作为参数

将内容与工作表顶部而不是中间对齐

试图同时实现两个混合过渡

在视图中设置所有变量

Swift - 导入我的 swift 类

如何在 Swift 中将对象归零

调整文本的字体大小以适应 UIButton

Swift:如何从函数返回类类型

为什么'nil' 与 Swift 3 中的 'UnsafePointer' 不兼容?

Swift 3:小数到 Int

如何快速将弹出框调整为表格视图中内容的大小?