Files
e-party-iOS/yana/Utils/Network/APIService+Combine.swift
edwinQQQ 8b4eb9cb7e feat: 更新API相关逻辑及视图结构
- 在Info.plist中新增API签名密钥配置。
- 将Splash视图替换为SplashV2,优化启动逻辑和用户体验。
- 更新API请求中的User-Agent逻辑,使用UserAgentProvider提供的动态值。
- 在APILogger中添加敏感信息脱敏处理,增强安全性。
- 新增CreateFeedPage视图,支持用户发布动态功能。
- 更新MainPage和Splash视图的导航逻辑,整合统一的AppRoute管理。
- 移除冗余的SplashFeature视图,提升代码整洁性和可维护性。
2025-09-17 16:37:21 +08:00

39 lines
1.5 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Foundation
@preconcurrency import Combine
// @unchecked Sendable Future promise
private final class PromiseBox<Output, Failure: Error>: @unchecked Sendable {
private let fulfill: (Result<Output, Failure>) -> Void
init(_ fulfill: @escaping (Result<Output, Failure>) -> Void) { self.fulfill = fulfill }
func complete(_ result: Result<Output, Failure>) { fulfill(result) }
}
extension APIServiceProtocol {
/// async/await Combine Publisher
/// - Parameter request: APIRequestProtocol
/// - Returns: AnyPublisher<T.Response, APIError>
func requestPublisher<T: APIRequestProtocol>(_ request: T) -> AnyPublisher<T.Response, APIError> {
Deferred {
Future { promise in
let box = PromiseBox<T.Response, APIError>(promise)
Task(priority: .userInitiated) {
let result: Result<T.Response, APIError>
do {
let value = try await self.request(request)
result = .success(value)
} catch let apiError as APIError {
result = .failure(apiError)
} catch {
result = .failure(.unknown(error.localizedDescription))
}
box.complete(result)
}
}
}
.subscribe(on: DispatchQueue.global(qos: .userInitiated))
.eraseToAnyPublisher()
}
}