展示示例比尝试解释它更容易,将使用 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
?
如果我理解正确的话,这应该可行
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.
}