Ios 为什么即使在指定了返回后台线程到主线程问题之后,代码仍然执行? 我有一个代码,它可以访问服务器,遍历一个名称列表,并为我找到一个与我的查询匹配的名称 我通过将整个服务器请求放在后台线程上来处理错误&使用throw语句处理错误(基本上是函数throws) 当我有一个错误时,比如说“连接到服务器失败”,throw语句被成功调用&在catch块被成功捕获

Ios 为什么即使在指定了返回后台线程到主线程问题之后,代码仍然执行? 我有一个代码,它可以访问服务器,遍历一个名称列表,并为我找到一个与我的查询匹配的名称 我通过将整个服务器请求放在后台线程上来处理错误&使用throw语句处理错误(基本上是函数throws) 当我有一个错误时,比如说“连接到服务器失败”,throw语句被成功调用&在catch块被成功捕获,ios,swift,xcode,Ios,Swift,Xcode,问题是,每当我出错时,我都需要更新主线程上的UI。我使用dispatchQueue.main.async来实现这一点&使用return语句。但是return语句之后的代码仍然被执行。我做错了什么 在下面的代码中,成功调用了.queueNetworkFailed的枚举错误情况的catch块。但是看起来return不会停止程序执行。do-catch语句之后的代码仍然被执行。是因为后台对主线程的错误处理吗 func startConnection(){ getServerTim

问题是,每当我出错时,我都需要更新主线程上的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
                    }
                }
            }
        }
    }

您将从调度的主队列中的执行流返回。您应该从主队列的外部返回,以停止当前队列中以下代码的执行

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

您将从调度的主队列中的执行流返回。您应该从主队列的外部返回,以停止当前队列中以下代码的执行

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

谢谢你的回答。我将尝试一下,并将其标记为正确答案,不客气。它应该会起作用。您可以通过一个简单的示例来检查它,方法是尝试创建一个函数并从调度队列内部和外部返回。谢谢您的回答。我将尝试一下,并将其标记为正确答案,不客气。它应该会起作用。您可以通过一个简单的示例来检查它,方法是尝试创建一个函数并从调度队列内部和外部返回。