iOS 中的视图控制器从导航堆栈弹出后解析中的完成块

Completion Block in Parse After View Controller is Popped Off Navigation Stack in iOS

我目前正在使用 Parse 作为我正在开发的移动应用程序的后端。文档建议在后台保存项目并在保存完成后提供一个完成块,如下所示:

var someObject = PFObject(className: "SomeObject")
someObject.saveInBackgroundWithBlock {
    (success: Bool, error: NSError?) -> Void in
    if (success) {
        //saved
        //call another method in this view controller
    } else {
        //error
    }
}

我在作为导航控制器一部分的视图控制器中的一个方法中执行此操作。

我的问题是:在执行块中,如果我在视图控制器中添加了对另一个方法的调用,比方说,用一些新数据更新视图,并且视图已经消失或被关闭,因为用户在调用执行块之前返回到上一个视图,是否会因为此时视图控制器消失或释放而导致崩溃?或者即使视图当前未显示并从导航堆栈中弹出,视图控制器是否会保留在内存中直到块完成?

使用 iOS 9、Swift 2.1 和 Parse 1.9。另外,如果有帮助,我知道执行块是在主线程上执行的。

它会为所欲为。您只需正确编码即可。

例如:

someObject.saveInBackgroundWithBlock {
    (success: Bool, error: NSError?) -> Void in
    if (success) {
        self.someFunction()
    } else {
        //error
    }
}

以上将导致视图控制器在内存中徘徊,直到 someFunction() returns。你可能不想要这个,但如果你想要,那就是怎么做的。如果您想要,那么:

someObject.saveInBackgroundWithBlock {
    [weak self] (success: Bool, error: NSError?) -> Void in
    if (success) {
        self?.someFunction()
    } else {
        //error
    }
}

使用上面的代码,如果视图控制器退出,并因此被删除,在块被调用之前,someFunction不会被调用,因为self 将为零。

要了解有关此构造的更多信息,请在 Swift 编程书籍 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html

中查找 "Capture Lists"