swift - 如何链接 Swift Futures
问题描述
我定义了以下功能:
func createAccessControl() -> Future<SecAccessControl, Error>
func evaluatePolicy(context: LAContext, localizedReason: String) -> Future<LAContext, Error>
func evaluateAccessControl(
context: LAContext,
accessControl: SecAccessControl,
operation: LAAccessControlOperation,
localizedReason: String
) -> Future<LAContext, Error>
func copy(query: [String: Any]) -> Future<Data, Error>
我想像这样将它们链接在一起:
func load(key: String, context: LAContext = LAContext(), localizedReason: String) -> Future<Data, Error> {
createAccessControl().flatMap { accessControl in
evaluatePolicy(context: context, localizedReason: localizedReason)
.flatMap { context in
evaluateAccessControl(context: context, accessControl: accessControl, operation: .useItem, localizedReason: localizedReason)
}
.flatMap { context in
copy(query: [
kSecClass as String: kSecClassGenericPassword as String,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecAttrAccessControl as String: accessControl,
kSecUseAuthenticationContext as String: context,
kSecReturnData as String: kCFBooleanTrue,
kSecMatchLimit as String: kSecMatchLimitOne,
])
}
}
}
但是,我收到此错误:
Cannot convert return expression of type 'Publishers.FlatMap<Publishers.FlatMap<Future<Data, Error>, Publishers.FlatMap<Future<LAContext, Error>, Future<LAContext, Error>>>, Future<SecAccessControl, Error>>' to return type 'Future<Data, Error>'
我认为flatMap
应该使结果类型变平,但这似乎并没有像我预期的那样发生。
我如何将期货链接在一起,类似于 JavaScript 的“then”?
解决方案
将我的返回类型从 更改Future<>
为AnyPublisher<>
消除了所有编译器错误,并且只需要调用eraseToAnyPublisher()
这些函数内部。例如:
func evaluateAccessControl(context: LAContext, accessControl: SecAccessControl, operation: LAAccessControlOperation, localizedReason: String) -> AnyPublisher<LAContext, Error> {
Future() { promise in
context.evaluateAccessControl(accessControl, operation: operation, localizedReason: localizedReason) { success, error in
if let error = decodeLAError(error) {
promise(.failure(error))
} else if success {
promise(.success(context))
}
}
}.eraseToAnyPublisher()
}
推荐阅读
- redis - Redis批量插入未插入所有内容
- azure-cosmosdb-sqlapi - 使用 IN 子句参数化 CosmosDB 查询
- php - PhP 表单正常发布(通过电子邮件接收数据)但显示 FORM.PHP PAGE NOT FOUND
- memory - 如何在 Jupyter Notebook 中的每个 pyspark 作业后释放分配的内存/CPU?
- python - Python.BeautifulSoup:尝试使用 beautifulsoup 在给定样式的网站上抓取纯文本
- javascript - AJAX 重新加载间隔(轮询)帮助
- javascript - AngularJS 分页错误:无法捕获当前页面索引
- java - 在 Android Studio 中使用列表适配器和自定义列表视图时出现 NullPointerExcepter 错误
- c# - 检测 Xamarin Scrollview 何时到达末尾
- c# - 从 SQL 转换为 Linq 时 LINQ 中的替代方法/函数