【问题标题】: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
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: ios swift xcode


    【解决方案1】:

    您正在从 Dispatched Main Queue 中的执行流程中返回。您应该从主队列外部返回以停止当前队列中以下代码的执行。

    DispatchQueue.main.async {
        self.userState = 1
    }
    return //EXPECT TO STOP HERE...
    

    【讨论】:

    • 感谢您的回答。将尝试并将其标记为正确答案
    • 不客气。它应该工作。您可以通过尝试创建一个函数并从调度队列内部和调度队列外部返回来通过一个简单的示例进行检查。
    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 2019-08-18
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多