Swift 如何在网络操作工作流中添加抛出

Swift 如何在网络操作工作流中添加抛出,swift,Swift,我有下面的实现,如果在下面的工作流中发生任何问题,我很难抛出。正如您在我的代码中看到的,我要么返回nil,要么不返回任何内容,不知道如何处理这些场景 enum ContentServiceError: Error { case EncodingError case URLInvalidError } DispatchQueue.global(qos: .background).async { postContent(id: id, content: content) { (erro

我有下面的实现,如果在下面的工作流中发生任何问题,我很难抛出。正如您在我的代码中看到的,我要么返回nil,要么不返回任何内容,不知道如何处理这些场景

enum ContentServiceError: Error {
  case EncodingError
  case URLInvalidError
}

DispatchQueue.global(qos: .background).async {
  postContent(id: id, content: content) { (error) in
    DispatchQueue.main.async { [weak self] in
        // handle throw here
    }
  }
}

func postContent(
    id: String?,
    content: String,
    completion: @escaping(Error?) -> ()
  ) {
    guard
      let id = id,
      let url =  URL(string: "\(baseURL)\(contentEndPoint)\(id)"),
      let contentData = contentData(from: Content(id: id, content: content)),
    else {
      // how to add throw here
      return
    }
    let request = Request(headers: nil, httpMethod: .post, httpBody: contentData, parameters: nil, url: url)
    let networkHandler = NetworkHandler(urlSession: URLSession(configuration: URLSessionConfiguration.ephemeral))
    networkHandler.dataRequest(request, successHandler: { data in
      completion(nil)
    }, failureHandler: { error in
      completion(error)
    })
  }


 private func contentData(content: Content) -> Data? {
    var content: Data
    do {
      let encoder = JSONEncoder()
      contentData = try encoder.encode(content)
    } catch {
      // how to add throw here 
      return nil
    }
    return contentData
  }

您需要声明函数来抛出和移除捕获

private func contentData(content: Content) throws -> Data {
  var content: Data
  let encoder = JSONEncoder()
  return try encoder.encode(content)
}
当然,您需要决定如何处理调用函数,如果它也抛出错误,或者使用do/catch并处理它,可能会调用带有错误的完成处理程序

do { 
  let contentData = try contentData(from: Content(id: id, content: content))
} catch {
  completion(error)
  return
}
我认为将
id
作为可选项没有任何意义,如果它是nil,则只抛出一个错误,而将其设置为非可选项。对于url创建,您可以进行与上面类似的处理

guard let url = URL(string: "\(baseURL)\(contentEndPoint)\(id)") } else {
  completion(ContentServiceError.URLInvalidError)
  return
}

谢谢你的快速回复。实际上,我的问题是如何在完成处理程序中处理这个抛出,换句话说,从调用方方法一直到线程。投票赞成你的答案。我需要把
Do catch
放在
guard
语句中吗?我应该在下一行添加
try
,对吗
let contentData=try contentData
@konya查看我的更新答案它是数据,因为函数将返回数据对象或抛出错误,但它永远不会返回nil,而不是仅抛出一般错误,最好抛出encoder@LeoDabus,你介意在这里加上你的答案吗?我喜欢你的方法。