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的所有澄清和解释。你给我的答案就像一本圣经,我要永远保存它。罗伯,你对下面的问题有什么想法吗