为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?
Posted
技术标签:
【中文标题】为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?【英文标题】:Why does code execute even after specifying return - background thread to main thread issue?为什么即使在指定返回 - 后台线程到主线程问题后代码也会执行? 【发布时间】: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
【问题讨论】:
【参考方案1】:您正在从 Dispatched Main Queue 中的执行流程中返回。您应该从主队列外部返回以停止当前队列中以下代码的执行。
DispatchQueue.main.async
self.userState = 1
return //EXPECT TO STOP HERE...
【讨论】:
感谢您的回答。将尝试并将其标记为正确答案 不客气。它应该工作。您可以通过尝试创建一个函数并从调度队列内部和调度队列外部返回来通过一个简单的示例进行检查。以上是关于为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?的主要内容,如果未能解决你的问题,请参考以下文章
将 NSManagedObject(在主上下文中创建)从后台线程传递到主线程是不是安全?
合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存