捕获自我从未使用过

时间:2016-11-03 15:03:53

标签: swift queue alert

我没有发布整个代码,因为它实在太大了。无论如何,它是以这种方式构建的用户注册。

有一个模态,其子视图是pageViewController:

  • 第一页是登录;
  • 第二页是注册;

从登录,您可以访问注册,一旦注册,pageViewController应自动转换到第一页,以便用户可以使用他的新凭据登录。

用户注册的过程由按钮和Alamofire管理:一旦点击按钮,用户在文本域中插入的值就会被验证,然后我开始发布请求,将数据发送到服务器并接收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会产生警告:"捕捉自我从未使用过"。我究竟做错了什么?

2 个答案:

答案 0 :(得分:1)

如果您没有在异步块中使用self,那么您将明显收到此警告。请尝试使用_代替self

答案 1 :(得分:0)

查看什么是swift捕获列表,查看此示例...

var i = 25

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

i = 35

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

警告信息“捕获自己从未使用过”因此不言自明。你不需要把自己放在捕获列表中,因为你没有在那里使用它