我目前正在使用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。另外,如果有帮助,我知道执行块是在主线程上执行的。
答案 0 :(得分:4)
它会做你想做的任何事情。你只需要正确编码即可。
例如:
someObject.saveInBackgroundWithBlock {
(success: Bool, error: NSError?) -> Void in
if (success) {
self.someFunction()
} else {
//error
}
}
以上将导致视图控制器在内存中闲逛,直到 someFunction()
之后的返回。你可能不想要这个,但如果你这样做,那就是怎么做的。如果您不想那么:
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
中