찾다

 >  Q&A  >  본문

ios - swift使用闭包传值

1.我有一个swift项目,在XMPP注册模块,我使用闭包传值(代理会了,学学闭包用法),把注册结果传回控制器。
1 初始化

2注册成功赋值

3 作为返回值


4 在控制器中调用

5 结果是不注册他直接不注册,也不连接服务器了。直接返回

6 然后 我找到一个解决办法,一开始给上一种注册结果

7 再 返回

8 最后 结果出来了 注册成功
但是 把我给他初始化赋的结果也打印出来了

咋回事啊 ?

大家讲道理大家讲道理2890일 전382

모든 응답(2)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-17 17:50:47

    귀하의 이번 일은 폐쇄와 관련이 없는 것 같습니다 Closure

    다음 답변
    이 충돌의 문제는 분명합니다. 값이 nilOptional

    유형의 압축을 강제로 풀었습니다.

    그림 5: '치명적인 오류: 선택적 값 래핑을 해제하는 동안 예기치 않게 nil이 발견됨'

    이유

    1. connectToHost()은 이 줄이 실행된 후 return registerRes!

    2. 이 즉시 실행됩니다.
    3. 그러나 현재 연결이 진행 중이며 아직 콜백되지 않았습니다. func xmppStreamDidRegister(sender: XMPPStream!) 방법

    4. 초기화 중 registerRes 값은 여전히 ​​nil입니다.

      회신하다
      0
  • 巴扎黑

    巴扎黑2017-04-17 17:50:47

    전체 프로세스는 클로저와 관련이 없습니다... 변수가 확실히 값을 가지므로 실제로 물음표 대신 느낌표를 사용할 수 있으므로 생성할 때 nil을 할당할 필요가 없습니다. 그것을 얻을 때 수동으로 압축을 풀 필요가 없습니다. 글쎄, 나는 당신의 코드에 있는 작은 문제에 대해 이야기하고 있습니다. 질문하고 싶은 이유는 위에 언급되어 있습니다. 콜백을 만들고 connectHost에 이 콜백을 걸 수 있습니다. 이것은 콜백을 전달하기 위해 각 레이어에 구멍을 열게 될 뿐입니다... 물론 Github에는 Async라는 프로젝트가 있는데, 그 구현을 주의 깊게 살펴보지 않았기 때문입니다. 여기서 과시하기가 어렵습니다.

    회신하다
    0
  • 취소회신하다