【问题标题】:Unable to get callback in closure in swift?无法快速关闭回调?
【发布时间】:2017-07-10 08:39:14
【问题描述】:

我有视图控制器,我从那里将媒体上传到 firebase 并将媒体的 url 作为 API 调用发送到我的服务器。现在,为了上传图像和调用 API,我创建了单独的类。我创建了一个函数来完成上传工作。

OfflineSync 类函数

 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

    })
    }

但问题是我从来没有收到任何回调到我的控制器。我收到了 uplaodplaceuplaodmediatofirebase 函数的回调。但是我从来没有收到我的控制器的回调。请告诉我可能是什么问题?

【问题讨论】:

    标签: ios swift xcode callback closures


    【解决方案1】:

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

    前,

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

    【讨论】:

    • 我无法解决这个问题。仍然无法获得回调。我在主线程中添加了方法
    • failure: { (failure) infailure的值是多少?
    • 并显示editplace的代码,可能有问题。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多