小编Mic*_*cio的帖子

Swift 组合链接 .mapError()

我正在尝试实现类似于下面介绍的场景的东西(创建 URL,请求服务器,解码 json,在自定义NetworkError枚举中包装的每个步骤上都出错):

enum NetworkError: Error {
    case badUrl
    case noData
    case request(underlyingError: Error)
    case unableToDecode(underlyingError: Error)
}

//...
    func searchRepos(with query: String, success: @escaping (ReposList) -> Void, failure: @escaping (NetworkError) -> Void) {
        guard let url = URL(string: searchUrl + query) else {
            failure(.badUrl)
            return
        }

        session.dataTask(with: url) { data, response, error in
            guard let data = data else {
                failure(.noData)
                return
            }

            if let error = error {
                failure(.request(underlyingError: error))
                return
            }

            do {
                let repos …
Run Code Online (Sandbox Code Playgroud)

swift combine

10
推荐指数
1
解决办法
5024
查看次数

Swift 并发多个等待单个异步结果

AuthorizationRequester可以同时从许多地方调用它,但只有第一个调用可以运行requestAuthorizationFromUser()(并等待几十秒的用户交互) - 其余的这些调用应该await是来自 的结果requestAuthorizationFromUser(),但不能直接调用它。

看代码:

actor AuthorizationRequester {
    enum SimpleResult {
        case success, failure
    }
    
    typealias ResultCompletion = (SimpleResult) -> ()
    
    private var requestInProgress = false
    private var requestCompletions = [ResultCompletion]()
    
    func request(completion: @escaping ResultCompletion) async {
        requestCompletions.append(completion)
        
        guard !requestInProgress else { return }
        
        requestInProgress = true
        
        let result = await requestAuthorizationFromUser()
        
        requestCompletions.forEach { $0(result) }
        requestCompletions.removeAll()
        requestInProgress = false
    }
    
    private func requestAuthorizationFromUser() async -> SimpleResult {
        // ...some code
    } …
Run Code Online (Sandbox Code Playgroud)

swift swift-concurrency

4
推荐指数
1
解决办法
1074
查看次数

标签 统计

swift ×2

combine ×1

swift-concurrency ×1