1.我有一个swift项目,在XMPP注册模块,我使用闭包传值(代理会了,学学闭包用法),把注册结果传回控制器。1 初始化
2注册成功赋值
3 作为返回值
4 在控制器中调用
5 结果是不注册他直接不注册,也不连接服务器了。直接返回
6 然后 我找到一个解决办法,一开始给上一种注册结果7 再 返回
8 最后 结果出来了 注册成功 但是 把我给他初始化赋的结果也打印出来了
咋回事啊 ?
光阴似箭催人老,日月如移越少年。
我看你的这个好像和闭包 Closure 并没有关系
Closure
以下解答此次 Crash 的问题很明显, 你对一个值为 nil 的 Optional 类型进行了强制解包
nil
Optional
图5:'fatal error: unexpectedly found nil while unwrapping an optional value'
原因
你的 connectToHost() 应该是异步方法. 该行执行后, 立即就执行了 return registerRes!
connectToHost()
return registerRes!
但此时, 你的连接还进行中还未回调 func xmppStreamDidRegister(sender: XMPPStream!) 方法
func xmppStreamDidRegister(sender: XMPPStream!)
你的 registerRes 还是初始化的时候的值 nil
registerRes
你这整个过程都和闭包没关系……既然你的那个变量肯定会有值,其实可以用叹号替代问号,这样在创建时也不用给它赋值nil,获取时也不用手动解包。好吧我只是说说你代码上的小问题,至于你要问的问题原因楼上已经说了,你可以造个callback,把这个callback挂到connectHost上。只是这样会在每一层都开个洞去传callback……当然也有优雅的解决方案,Github上有个项目叫Async你可以参考,因为我没细看它的实现也不好在这装逼
我看你的这个好像和闭包
Closure
并没有关系以下解答
此次 Crash 的问题很明显, 你对一个值为
nil
的Optional
类型进行了强制解包原因
你的
connectToHost()
应该是异步方法. 该行执行后, 立即就执行了return registerRes!
但此时, 你的连接还进行中还未回调
func xmppStreamDidRegister(sender: XMPPStream!)
方法你的
registerRes
还是初始化的时候的值nil
你这整个过程都和闭包没关系……既然你的那个变量肯定会有值,其实可以用叹号替代问号,这样在创建时也不用给它赋值nil,获取时也不用手动解包。好吧我只是说说你代码上的小问题,至于你要问的问题原因楼上已经说了,你可以造个callback,把这个callback挂到connectHost上。只是这样会在每一层都开个洞去传callback……当然也有优雅的解决方案,Github上有个项目叫Async你可以参考,因为我没细看它的实现也不好在这装逼