swift - 转义采用可选参数的完成处理程序有时会使 Swift 崩溃

标签 swift firebase asynchronous google-cloud-firestore swift4

我有这个代码:

 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
        }
    }
}

有时它会在completion(nil) 行 崩溃,并显示错误代码

Thread 1: EXC_BREAKPOINT (code=1, subcode=0x102ba1774)

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

这是我用来调用完成处理程序的确切代码。它位于 firestore 事务的完成 block 中:

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()
                })
            }

会不会是事务多次调用completion handler的问题?

最佳答案

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

关于swift - 转义采用可选参数的完成处理程序有时会使 Swift 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52013728/

相关文章:

ios - 调用 Auth.auth().signOut() 会自动关闭 ViewController

ios - 为什么使用 FirebaseUI 的苹果登录不起作用?

c# - 您是否必须为异步方法调用调用 EndInvoke (或定义回调),即使它返回时您无事可做

c# - 通过构建器模式使用异步任务

grails - 异步调用Controller-适用于州和县

ios - 更改 UIView 边框的形状

swift - AudioKit 的毛刺噪声

android - 应用程序仅在 Debug模式下崩溃

使用 Firebase 数据消息终止应用程序时未收到 iOS 推送通知

python - 我如何让我的 IOS 应用程序与我的 python 脚本通信