在Swift中,无法在闭包中获得回调?

4
我有一个视图控制器,从中我可以上传媒体到Firebase,并将媒体的URL作为API调用发送到我的服务器。现在,为了上传图片和调用API,我创建了一个单独的类。在那里,我创建了一个执行上传工作的函数。
离线同步类函数
 func UploadMediaToFireBase(sucess:@escaping ()->(),failure:@escaping (DIError)->()) {


            DIFirebaseImageManager.firebaseInstance.uploadImage(data: data, withName: filepath, mimeType: mimeType, progress: { (progress)
                in


            }) { (callback, firebaseUrl, error) in

                if let url = firebaseUrl {
                    self.uploadplace(place: self.place, done: {
                        sucess()
                        Utility.shared.hideLoader()

                    }, failed: { (result) in
                        failure(result)
                        Utility.shared.hideLoader()
                    })
                }

            }
        }

现在当我收到URL时,我会调用这个函数。
 func uploadplace(place:place,done:@escaping ()->(),failed:@escaping (DIError)->()) {

            if let placeId = place.id {
                placeManager.shared.editplace(placeId: placeId, place: place, success: { (success) in
                    AlertBar.show(.success, message: AppMessages.place.placeEdited)

                    done()
                }, failure: { (failure) in
                    self.status = .cancelled
                    failed(failure)
                })
            }

    } 

当我在Firebase上上传媒体并将URL保存在我的服务器上时,然后我向我的控制器发送回调,如下所示的代码:

   OfflineSync.shared.UploadMediaToFireBase(sucess: {
    DILog.print(items: "CallBack to MediaController")
    self.navigationController?.popViewController(animated: true)
    }, failure: { (failure) in

    })
    }

但问题是我从未收到任何回调到我的控制器。我收到了uplaodplace的回调到uplaodmediatofirebase函数。但我从未收到回调到我的控制器。请告诉我可能出了什么问题?

1个回答

2

尝试在主线程上调用闭包方法,例如:

DispatchQueue.main.async{
    sucess()
}

同样适用于以下内容:

  • failure(result)

  • done()

  • failed(failure)

还有其他内容。

重构代码,

同时,似乎您没有处理if let语句的else条件。

if let url = firebaseUrl {
                    self.uploadplace(place: self.place, done: {
                        sucess()
                        Utility.shared.hideLoader()

                    }, failed: { (result) in
                        failure(result)
                        Utility.shared.hideLoader()
                    })
                }else{
                        failure(failureResult)
                }

另外,针对这一点,

if let placeId = place.id {
                placeManager.shared.editplace(placeId: placeId, place: place, success: { (success) in
                    AlertBar.show(.success, message: AppMessages.place.placeEdited)

                    done()
                }, failure: { (failure) in
                    self.status = .cancelled
                    failed(failure)
                })
            }else{
                    failed(someFailure)
            }

我无法解决这个问题。仍然无法获得回调。我已经在主线程中添加了方法。 - TechChain
failure: { (failure) in 中的 failure 的值是什么? - Mohammad Zaid Pathan
请展示editplace的代码,它可能存在问题。 - Mohammad Zaid Pathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接