为啥即使在指定返回 - 后台线程到主线程问题后代码也会执行?

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(在主上下文中创建)从后台线程传递到主线程是不是安全?

合并到主线程上下文时,在后台线程上下文中更新的可转换属性未保存

在 Windows 操作系统的情况下,如何将数据从 OpenCV 或 C++ 线程函数返回到主线程?

从firebase获取数据并将其返回到主线程[重复]

如何将数据从AsyncTask返回到主线程