Swift 捕获自我从未被使用过

Swift 捕获自我从未被使用过,swift,queue,alert,Swift,Queue,Alert,我不会发布整个代码,因为它实在太大了。无论如何,这是一个用户注册建立这种方式 有一个模态,其子级是pageViewController: 第一个页面用于登录 第二页为注册页 从登录您可以到达注册,注册后,pageViewController应自动转换到第一页,以便用户可以使用其新凭据登录 用户注册过程由一个按钮和Alamofire管理:单击按钮后,验证用户在文本字段中插入的值,然后启动post请求,将数据发送到服务器,并在一段时间后接收JSON数据 这很简单(抱歉说得太多),但最后,在我收到

我不会发布整个代码,因为它实在太大了。无论如何,这是一个用户注册建立这种方式

有一个模态,其子级是pageViewController:

  • 第一个页面用于登录
  • 第二页为注册页
从登录您可以到达注册,注册后,pageViewController应自动转换到第一页,以便用户可以使用其新凭据登录

用户注册过程由一个按钮和Alamofire管理:单击按钮后,验证用户在文本字段中插入的值,然后启动post请求,将数据发送到服务器,并在一段时间后接收JSON数据

这很简单(抱歉说得太多),但最后,在我收到JSON后,这里发生了一些奇怪的事情:

let j = JSON as! NSDictionary
let userStatus = j.object(forKey: "status")!

    if((userStatus as! Int) == 0){

        //
        print("user registerd")

        let alert = UIAlertController(title: "Registration ok", message: "Registration OK", preferredStyle:UIAlertControllerStyle.alert)

        let okAlert = UIAlertAction(title:"OK", style: .default, handler: {action in v.scrollToPreviousViewController() })

        alert.addAction(okAlert)

        self.present(alert, animated: true, completion: nil)
这个代码应该做什么?用户单击警报按钮后,pageviewcontroller应返回登录屏幕并显示动画

会发生什么?它返回到那里,但没有动画

这让我认为我应该避免“污染”保留给GUI的全局线程。事实上,我试着把所有的代码放在一个

DispatchQueue.main.async { [unowned self] in
没有任何成功

然后,我尝试了另一件事:

let okAlert = UIAlertAction(title:"OK", style: .default, handler:
                                            {action in DispatchQueue.main.async { [unowned self] in v.scrollToPreviousViewController() }})
我不完全理解为什么,但这实际上是可行的,并且消除了动画的问题


但是,
unowned self
那里会产生一个警告:“捕获self从未被使用过”。我做错了什么

如果您没有在异步块中使用
self
,那么您将明显收到此警告。请尝试使用
\uu
而不是
self

查看swift捕获列表的用途,请检查此示例

var i = 25

var cl = {print(i)}
var clc = {[i] in print(i)}

i = 35

cl()   // 35
clc()  // 25

因此,警告消息“从未使用过Capture self”是不言自明的。你不需要把self放在你的捕获列表中,因为你没有在那里使用它。它也可以只保留v.scrollToPreviousViewController()。但是,这是做我正在做的事情的正确方式吗?:-)是的,太好了。如果您同意,请接受答案。如果明天有人没有发布有趣的内容,我会接受答案:-)如果我替换为u我得到了“截图捕获列表中的预期名称”@IanBell哪个错误,在哪里?它在我的操场上正常工作抱歉,我错了,这是一个XCode错误,不是您的代码:-)