更改作为参数传递的闭包签名的替代方案

问题描述 投票:0回答:1

展示示例比尝试解释它更容易,将使用 CoreData 作为上下文:

赋予

NSManagedObjectContext
perform()
功能(删除了签名中不必要的部分)

extension NSManagedObjectContext {
    public func perform<T>(_ block: @escaping () throws -> T) async rethrows -> T
} 

例如,我想为 MOC 编写一个调用此类函数的包装器。

class Persistence {
    func read<T>(_ block: @escaping (NSManagedObjectContext) throws -> T) async rethrows -> T { // 1.
        return try await container.viewContext.perform(block) // 2.
    }
}

这样我就可以使用它,例如:

try await persistence.read { moc in
    let repo = Repository(context: moc)
    ...
}

现在的问题是,给定

perform
所需的闭包签名
() throws -> T
(参见 // 1。) 我显然无法传递
(NSManagedObjectContext) throws -> T
类型的闭包(参见 // 2.)。

问题: 有没有一种模式可以让我在 Swift 中做这样的事情?或者并发安全替代

perform

swift core-data closures
1个回答
0
投票

如果我理解正确的话,这应该可行

func read<T>(_ block: @escaping (NSManagedObjectContext) throws -> T) async rethrows -> T {
    let moc = self.viewContext // or some background context
    return try await moc.perform { try block(moc) } // 2.
}
© www.soinside.com 2019 - 2024. All rights reserved.