【发布时间】:2020-07-19 18:31:30
【问题描述】:
- 我有一个访问服务器的代码,通过一个名称列表并找到一个与我的查询匹配的名称
- 我通过将整个服务器请求放在后台线程上来处理错误并使用 throw 语句处理错误(基本上是函数 throws)
- 当我遇到错误时 - 例如“无法连接到服务器”,throw 语句将被成功调用并在 catch 块中成功捕获。
问题是每当我遇到错误时,我都需要在主线程上更新 UI。我使用 dispatchQueue.main.async 来执行此操作并使用 return 语句。但是 return 语句之后的代码仍然被执行。我做错了什么?
在下面的代码中,.queueNetworkFailed的枚举错误情况的catch块被成功调用。但看起来 return 不会停止程序执行。 代码 在 do - catch 语句之后仍然会被执行。是不是因为主线程错误处理的背景?
func startConnection(){
getServerTimestamp { (timestamp, error) in
guard let timestampTemp = timestamp?.dateValue().timeIntervalSince1970 else {return}
let timestamp = Int(timestampTemp)
self.connectButtonPressedTimestamp = timestamp
DispatchQueue.global(qos: .background).async {
var partnerUid: String?
self.buildServerQuery()
do {
partnerUid = try self.findConnection()
} catch let error {
switch error as? ConnectError{
case .queueNetworkFail: //CALLED SUCCESSFULLY
DispatchQueue.main.async {
self.userState = 1
return //EXPECT FUNCTION TO STOP HERE BUT...
}
case .queueEmptyAtServer:
DispatchQueue.main.async {
self.establishState4()
return
}
case .queueEmptyAtLocal:
DispatchQueue.main.async {
self.establishState4()
return
}
case .none:
DispatchQueue.main.async {
self.userState = 1
return
}
}
}
if let partnerUid = partnerUid{ //FUNCTION EXECUTION CONTINUES DESPITE RETURN
self.finalizeConnection(partnerUid: partnerUid)
} else {
DispatchQueue.main.async {
print("Something went wrong")
self.userState = 1
}
}
}
}
}
【问题讨论】: