我有一个iOS应用程序,它使用一些API与电路板通信。我使用dispatch_async
在一个单独的线程中循环调用这些API,以测试健壮性并使用dispatch_async(get_main_queue())
将这些API的结果记录到文本视图中。但是这个应用程序在循环运行后几分钟就崩溃了。我评论了日志记录行并进行了检查,现在应用程序没有崩溃。
所以我限制textview中的字符应该是500.如果字符超过500,我将清除textview。但是应用程序仍然崩溃。
该应用有启动和停止按钮。 “开始”按钮启动循环,停止按钮根据bool变量停止循环。
这是我的代码:
@IBAction func start_pressed(sender:UIButton)
{
canRunLoop = true
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> () in
while self.canRunLoop {
let result = self.object.API1()
if result
{
self.logSuccessMessage("==> Write Data Response: \(result)”)
}
let result1 = self.object.API2()
if result1
{
self.logSuccessMessage("==> Write Data Response: \(result1)”)
}
let result2 = self.object.API3()
if result2
{
self.logSuccessMessage("==> Write Data Response: \(result2)”)
}
}
})
}
@IBAction func stop_pressed(sender:UIButton)
{
canRunLoop = false
}
func logSuccessMessage(str: String)
{
dispatch_async(dispatch_get_main_queue()) { () -> Void in
if self.successLogView.text.characters.count >= 500
{
self.successLogView.text = ""
self.successLogView.text.appendContentsOf("\(str)\n")
}
else
{
self.successLogView.text.appendContentsOf("\(str)\n")
// this is to auto scroll the view
if (self.successLogView.contentSize.height > self.successLogView.frame.size.height)
{
let range = NSMakeRange((self.successLogView.text as NSString).length - 1, 1);
self.successLogView.scrollRangeToVisible(range)
}
}
}
}
如果我在dispatch_sync中执行更新日志,则更新视图的代码将添加到主队列的末尾,从而导致死锁。
有人请帮助。提前致谢
我真的被这个困住了,请帮助我。