MST

星途 面试题库

面试题:Objective-C的PromiseKit异常处理及并发控制

在使用PromiseKit进行异步编程时,如果多个Promise任务并发执行,其中一个任务抛出异常,如何优雅地捕获并处理这个异常,同时保证其他任务继续执行直到完成?请编写示例代码说明。
20.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

在PromiseKit中,可以使用when(fulfilled:)方法来并发执行多个Promise任务,并且可以通过.catch块来捕获异常。为了保证其他任务继续执行直到完成,可以将每个任务包装在一个try块中,并在出现异常时返回一个被拒绝的Promise。

以下是示例代码:

import PromiseKit

func task1() -> Promise<Void> {
    return Promise { seal in
        // 模拟异步任务
        DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
            seal.fulfill(())
        }
    }
}

func task2() -> Promise<Void> {
    return Promise { seal in
        // 模拟异步任务
        DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
            // 模拟抛出异常
            throw NSError(domain: "com.example", code: 1, userInfo: nil)
        }
    }
}

func task3() -> Promise<Void> {
    return Promise { seal in
        // 模拟异步任务
        DispatchQueue.global().asyncAfter(deadline: .now() + 3) {
            seal.fulfill(())
        }
    }
}

func runTasks() {
    let tasks: [() -> Promise<Void>] = [task1, task2, task3]
    let promises = tasks.map { task in
        return Promise { seal in
            do {
                try task().done {
                    seal.fulfill(())
                }.catch { error in
                    seal.reject(error)
                }
            } catch {
                seal.reject(error)
            }
        }
    }
    
    when(fulfilled: promises).catch { error in
        print("捕获到异常: \(error)")
    }.finally {
        print("所有任务已完成(无论是否成功)")
    }
}

runTasks()

在上述代码中:

  1. task1task2task3是模拟的异步任务,其中task2会抛出异常。
  2. tasks数组包含了这三个任务。
  3. 使用map方法将每个任务包装在一个新的Promise中,这样即使某个任务抛出异常,也不会影响其他任务的执行。
  4. when(fulfilled: promises)用于并发执行所有包装后的Promise任务。
  5. .catch块用于捕获任何一个任务抛出的异常。
  6. .finally块用于在所有任务完成(无论成功或失败)后执行一些清理操作。