【问题标题】:Should I call completion handler when self is deallocated当 self 被释放时我应该调用完成处理程序吗
【发布时间】:2018-07-27 22:37:53
【问题描述】:

我们可能都使用过以下模式。这可能无关紧要,我只是好奇当self 不再存在时,我是否还应该调用完成处理程序?

var uid: String

func asyncTask(completion: @escaping(Result)->()) {
    anotherAsyncTask() { [weak self] (result) in
        guard let uid = self?.uid else { 
            completion(.error) // Should I call this???
            return 
        }
        // consume result
    }
}

【问题讨论】:

    标签: swift completionhandler


    【解决方案1】:

    由于self 被取消初始化,所以调用没有意义

    completion(.error) // Should I call this???
    

    因为结果已经在这里return足够了

    【讨论】:

    • 我不同意。返回枚举中存在错误情况。它用于报告错误,而释放 self 就是其中一种错误情况。
    • @DuncanC 根据你的意见,当用户进入一个VC,然后在回调返回之前快速返回,一个弹窗告诉他一个反馈,这在实际应用中实际上不会发生,操作将其分类为代码作为错误,用户不应该意识到这一点,你也认为自我释放是一个应该报告的错误
    • 公平点。您必须考虑在调用任务的完成处理程序之前释放 self 意味着什么。可能存在一些情况,例如用户关闭的视图控制器,您只想忽略这种情况,或者将成功枚举传递给完成处理程序。这取决于您的设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多