Экранирующий обработчик завершения, который принимает необязательный аргумент, иногда завершает работу Swift - PullRequest
0 голосов
/ 25 августа 2018

У меня есть этот код:

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

иногда происходит сбой в строке завершения (ноль) с кодом ошибки

Тема 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 Ответ

0 голосов
/ 25 августа 2018

Попробуйте добавить;иначе {завершение (ноль);возврат}

...