标签未正确更改

时间:2016-03-05 11:52:44

标签: ios swift swift2 uilabel

在我的应用中,我正在接收UDP命令。当收到某个UDP命令时,应该更改标签,但这不会发生。这是我的代码:

func listenForStatusChange() {

     self.firstServerRun = true



    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in

         while 1 == 1 {




            if self.packetReceived == true || self.firstServerRun == true {

                self.firstServerRun = false


                self.packetReceived = false

                let server:UDPServer=UDPServer(addr:"192.168.1.9",port: 8888)
                let run:Bool=true

                while run{




                    let (data, _,_)=server.recv(1024)
                    if let d=data{
                        if let str=String(bytes: d, encoding: NSUTF8StringEncoding){

                            self.packetReceived = true

                            if str == "Online" {

                                dispatch_async(dispatch_get_main_queue()) {
                                        print("it is online")
                                        self.statusLabel.text = "Online"
                                        self.switchOnline = true

                                }
                            }


                            if str == "1" {

                                self.lampValue = 1
                                self.state = str

                            }

                            if str == "0" {

                                self.lampValue = 0
                                self.state = str

                            }


                           // self.changeSwitchValue()




                        }
                    }

                    server.close()
                    break

                }

            } else {

            }


         }
    })



}

从ViewDidLoad调用此函数。如果str ==" online&#34 ;, self.statusLabel.text应该等于" Online"。当viewController加载时,就是这种情况。但是,当我回到另一个ViewController并回到这个时,它再也不起作用了。该功能仍然被调用(因为"它在线"仍然打印)但标签不再显示..

有任何帮助吗?非常感谢你!

1 个答案:

答案 0 :(得分:1)

我有一个疯狂的猜测。

从您的代码中猜测,视图控制器可能正在订阅某些其他对象或信号作为观察者。

当您从视图中弹出VC时,您期望VC为deinit。但我不认为会发生这种情况,因为你在无限循环中强烈提及 self

当您第二次呈现VC时,此VC的上一个实例仍在内存中,但不再可见。我猜测新实例无法作为观察者或其他东西进行订阅,但您仍然可以看到来自此VC的先前内存实例的日志消息。

print(self)中记录AND时,尝试记录自我viewDidLoad())。

第二次展示这个VC后,如果两个记录的自我的记忆地址不匹配,我想我是对的。

解决方案可能是在关闭的捕获列表中包含一个弱自我,所以你没有强烈的引用,如下所示:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { [weak self] () -> Void in

        if let weakSelf = self {

            while 1 == 1 {

            }
        }
    })

注意封闭体前面的 [弱自我]

或者你知道......不要使用无限循环