Swift 如何在网络操作工作流中添加抛出
我有下面的实现,如果在下面的工作流中发生任何问题,我很难抛出。正如您在我的代码中看到的,我要么返回nil,要么不返回任何内容,不知道如何处理这些场景Swift 如何在网络操作工作流中添加抛出,swift,Swift,我有下面的实现,如果在下面的工作流中发生任何问题,我很难抛出。正如您在我的代码中看到的,我要么返回nil,要么不返回任何内容,不知道如何处理这些场景 enum ContentServiceError: Error { case EncodingError case URLInvalidError } DispatchQueue.global(qos: .background).async { postContent(id: id, content: content) { (erro
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,你介意在这里加上你的答案吗?我喜欢你的方法。