当前位置: 首页 > 知识库问答 >
问题:

转义接受可选参数的完成处理程序有时会崩溃

东方智敏
2023-03-14

我有这个代码:

 func function(completion: @escaping (_ error: Error?) -> Void){
    getSomethingFromUrl {(result) in
        guard let documentData = result.property else {
            completion(nil) //crashes with error Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102ba1774)
            return
        }
    }
}

有时它会在完成(nil)行崩溃,并带有错误代码

线程1:EXC_BREAKPOINT(代码=1,子代码=0x102ba1774)

考虑到参数是可选的,我不知道为什么它会崩溃,我只是把零传递给它。

以下是我用于调用完成处理程序的确切代码。它位于消防库事务的完成块中:

let docSizesRef = FirebaseHelper.References.firestoreReference.collection(FirestoreCollections.onlineUsers).document(FirestoreDocuments.documentSizeTracker)
                            FirebaseHelper.References.firestoreReference.runTransaction({ (transaction, errorPointer) -> Any? in
                                let docSizesDocument: DocumentSnapshot
                                do {
                                    try docSizesDocument = transaction.getDocument(docSizesRef)
                                } catch let fetchError as NSError {
                                    errorPointer?.pointee = fetchError
                                    return nil
                                }

                                let oldCount = docSizesDocument.data()?[documentIdToWriteTo] as? Int ?? 0

                                transaction.updateData([documentIdToWriteTo: oldCount + 1], forDocument: docSizesRef)
                                return nil
                            }) { (object, error) in
                                completion(error)
                                if let error = error {
                                    print("Transaction failed: \(error)")
                                } else {
                                    print("Transaction successfully committed!")
                                }
                            }

下面是处理完成的代码

func addUserToOnlineDocs(){
                User.shared.managers.accountManager.addToOnlineDocs(completion: { (error) in
                    if let error = error{
                        self.createTwoButtonAlert(title: AlertErrors.Account.Titles.errorAddingToOnlineList, message: error.localizedDescription, rightButtonText: self.retryButton, leftButtonText: self.ignoreButton, rightButtonStyle: .cancel, leftButtonStyle: .default, completion: { (buttonPressed) in
                            if buttonPressed == self.retryButton{
                                connectionSetup()
                            }
                        })
                        return
                    }
                    self.loadingCompleteDispatchGroup.leave()
                })
            }

这可能与事务多次调用完成处理程序有关吗?

共有1个答案

薄涵衍
2023-03-14

尝试添加;否则{完成(无);返回}

 类似资料:
  • 我基本上想有一个可选的完成处理器,没有参数被传递回来。这是我目前掌握的情况,但显然是错误的。 我不想在完成块中传递任何参数。我只想知道网络调用何时完成,以便刷新UI。我不想在这里刷新UI,因为我希望它充当刷新数据的通用函数。我之所以希望完成处理程序是可选的,是因为有时候刷新完成后我不需要做任何事情。 我也很困惑“逃离”是什么意思。当我做这样的事情时,我通常会有它,但任何清晰都会很好。我在网上做了一

  • 我试图更准确地理解斯威夫特的“关闭”。 但是和太难理解了 我搜索了许多Swift帖子和官方文件,但我觉得这仍然不够。 这是官方文件的代码示例 听说使用< code>@escaping有两种方式和原因 第一个用于存储闭包,第二个用于异步操作目的。 以下是我的问题: 首先,如果执行,则将使用闭包参数执行,并且该闭包将保存在全局变量数组中。 我认为闭包是{self.x=100} {self.x=100}

  • 我正在尝试在我的Swift应用程序中创建一个服务对象,以便更轻松地处理请求。我已经把它连接起来了,但是我可能误解了完成处理器。 我有这个函数,它只是发布到我正在运行的本地APIendpoint。 我需要做的就是把这个名字传给我在这里做的函数 但是,我现在收到此错误。 调用中缺少参数“completion”的参数 我的目标是返回< code>Response对象,这样我就可以访问它的属性,在UI中做

  • 我在地图中的几个位置进行反向地理编码,并希望将其包装为某种常用方法。我所拥有的是作为工作起点的: 但是,如果我想在我的完成方法中添加另一个参数,将会向我的视图返回错误,如下所示: 如果error为,那么我的将失败,因为错误为nil且访问错误。但我不能这样做,因为参数与完成处理程序不匹配。 因此,如果我有一个nil错误,我将如何调用我的完成处理程序?

  • 我目前正在学习swift,几个小时以来我一直在试图理解一个错误。由于查询,我试图从php脚本中获取一个xml文件,我使用一个完成处理程序作为回调来获取这些查询的结果。 问题是我对这些技术感到不舒服,它说缺少论据。 下面是使用完成处理程序的函数: 这是我调用这个函数的一段代码: 这段代码显示有关调用连接的此错误: 我做错了什么?为什么它要两个参数? 非常感谢您的帮助。 埃尔巴托

  • 我的完成处理程序有问题。下面是一个带有完成处理程序的函数,位于一个实用程序文件中: 我在视图控制器中调用它 输出清楚地表明该函数在运行该块之前没有等待完成: 我如何解决这个问题?