面试题答案
一键面试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)")
}
}
}
在上述代码中:
fetchData
是一个异步函数,模拟从网络获取数据,可能会抛出网络错误。processData
函数创建了一个Task
来调用fetchData
,并在任务执行过程中处理可能出现的错误。- 使用
DispatchQueue.main.asyncAfter
模拟在1秒后取消任务,task.cancel()
用于取消任务。 - 最后使用
try await task.value
来等待任务完成,并处理任务取消或其他错误。