MST

星途 面试题库

面试题:Swift并发中的异步函数与错误处理

假设有一个异步函数`fetchData`用于从网络获取数据,它可能会抛出网络错误。请使用Swift并发的方式,编写一个函数`processData`,该函数调用`fetchData`,获取数据后进行处理,并且要妥善处理可能出现的错误,同时展示如何优雅地取消任务。
11.3万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
import Foundation

func fetchData() async throws -> Data {
    // 模拟网络请求,这里简单返回一些数据,实际可能会抛出网络错误
    if arc4random_uniform(2) == 0 {
        throw NSError(domain: "NetworkError", code: -1, userInfo: nil)
    }
    return "Some Data".data(using:.utf8)!
}

func processData() async {
    let task = Task {
        do {
            let data = try await fetchData()
            // 处理数据
            if let string = String(data: data, encoding:.utf8) {
                print("Processed data: \(string)")
            }
        } catch {
            print("Error: \(error)")
        }
    }
    
    // 模拟在某个时刻取消任务
    DispatchQueue.main.asyncAfter(deadline:.now() + 1) {
        task.cancel()
    }
    
    do {
        try await task.value
    } catch {
        if case TaskCancellationError = error {
            print("Task was cancelled")
        } else {
            print("Other error: \(error)")
        }
    }
}

在上述代码中:

  1. fetchData 是一个异步函数,模拟从网络获取数据,可能会抛出网络错误。
  2. processData 函数创建了一个 Task 来调用 fetchData,并在任务执行过程中处理可能出现的错误。
  3. 使用 DispatchQueue.main.asyncAfter 模拟在1秒后取消任务,task.cancel() 用于取消任务。
  4. 最后使用 try await task.value 来等待任务完成,并处理任务取消或其他错误。