在闭包表达式中没有更改视图

时间:2014-07-25 18:44:47

标签: ios swift


我有这段代码:

@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;。 只是视图没有改变......

2 个答案:

答案 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之外,它会立即调用,因为它在函数中,它会立即调用你所在的位置。