Swift 介绍后台异步线程
我想在后台线程-Swift 介绍后台异步线程,swift,Swift,我想在后台线程-DispatchQueue.global().async中运行exportExcel(),但我无法实现它。任何帮助都将不胜感激 override func viewDidLoad() { super.viewDidLoad() setTableView() dataExport() } private func dataExport() { dataExport { [weak self] (res) in switch res { case .
DispatchQueue.global().async中运行exportExcel()
,但我无法实现它。任何帮助都将不胜感激
override func viewDidLoad() {
super.viewDidLoad()
setTableView()
dataExport()
}
private func dataExport() {
dataExport { [weak self] (res) in
switch res {
case .failure (let error):
print(error)
case .success(let data):
print("success")
}
}
}
private func dataExport(completion: @escaping(result)) {
do {
let data = try classVM.exportExcel()
completion(.success(data))
} catch { completion(.failure(error)) }
}
ClassViewModel.swift
func exportExcel() throws -> [[String]] {
guard let path = Bundle.main.path(forResource: name, ofType: type ) else { throw error }
do {
return try readData(filePath: path)
} catch {
throw error
}
}
如果要使此同步方法异步运行,只需
- 将代码分派到后台队列
- 完成后,调用
@转义
完成处理程序闭包,以便调用方知道何时完成
例如
func exportExcel(完成:@escaping(Result)->Void){
DispatchQueue.global().async{
做{
guard let path=Bundle.main.path(forResource:name,of type:type)else{throw ExportError.invalidPath}
让结果=尝试读取数据(filePath:path)
完成(.success(result))
}抓住{
完成(.failure(error))
}
}
}
顺便说一句,我不确定你对你的抛出错误的看法,所以我为此创建了一个错误,例如
枚举导出错误:错误{
病例无效路径
}
顺便说一下,人们通常会将结果发送回主队列:
func exportExcel(完成:@escaping(Result)->Void){
DispatchQueue.global().async{
做{
guard let path=Bundle.main.path(forResource:name,of type:type)else{throw ExportError.invalidPath}
让结果=尝试读取数据(filePath:path)
DispatchQueue.main.async{
完成(.success(result))
}
}抓住{
DispatchQueue.main.async{
完成(.failure(error))
}
}
}
}
当你想叫它的时候:
exportExcel{[weak self]导致
切换结果{
案例。失败(let错误):
打印(错误)
案例.成功(让数据):
打印(“成功”)
}
}
DispatchQueue.global().async{do{让数据尝试classVM…}catch{}}
相反?不相关,exportExcel
是一个奇怪的函数名,它看起来是读取文件,而不是保存/写入文件。也许importExcel
或readExcel
可能是一个更好的名字?你太棒了!非常感谢Rob的所有澄清和解释。你给我的答案就像一本圣经,我要永远保存它。罗伯,你对下面的问题有什么想法吗