在我的应用中,我正在接收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并回到这个时,它再也不起作用了。该功能仍然被调用(因为"它在线"仍然打印)但标签不再显示..
有任何帮助吗?非常感谢你!
答案 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 {
}
}
})
注意封闭体前面的 [弱自我] 。
或者你知道......不要使用无限循环