我有这段代码:
@IBAction func createUser(sender: AnyObject, forEvent event: UIEvent) {
userManager!.createUser( username.text, {
println( "new user created" )
self.navigationController.popToRootViewControllerAnimated( true )
self.callback!()
})
}
但调用此函数时,视图控制器未更改..
如果我在内部闭包表达式之外采用popToRootViewControllerAnimated,即:
@IBAction func createUser(sender: AnyObject, forEvent event: UIEvent) {
userManager!.createUser( username.text, {
println( "new user created" )
self.callback!()
})
self.navigationController.popToRootViewControllerAnimated( true )
}
视图将被更改,一切都会正常工作..
任何想法为什么?
更新: 为了清楚起见..我确实从createUser方法调用了这个表达式,而println正在引用"新用户创建了#34;。 只是视图没有改变......
答案 0 :(得分:4)
您必须仅在主线程上更改UI。由于popToRootViewControllerAnimated(...)
更改了UI,因此应该在主线程上调用它,您可以将其包装在GCD调用中:
dispatch_async(dispatch_get_main_queue()) {
if let nc = self.navigationController {
nc.popToRootViewControllerAnimated(true)
}
}
答案 1 :(得分:0)
除非createUser
方法调用closure
,否则不会调用。立即不调用Clousre。在createUser
方法中我们只是简化了闭包。它是{{{调用闭包。你需要调用clousre by参数,闭包就是这样的
createUser
如果你把createUser(userName:String,parameterNameWhichTakesClousre: () -> ()){
... //other instructions
parameterNameWhichTakesClousre() //put this in `createUser` to call closure.
}
放在clousre之外,它会立即调用,因为它在函数中,它会立即调用你所在的位置。