我有时会遇到崩溃" myApp在超出允许时间之前有主动断言:"在我今天的小部件中。经过一些谷歌搜索,我想这是因为我不恰当地处理后台任务。
我使用两种类型的后台任务。 dispatch_async和NSURLConnection。我是新手,我无法弄清楚哪一个是问题所在。 (已经有很多问题和答案,但我无法找到适合我情况的那个)
以下是我的代码的缩短版本。
override func viewDidLoad() {
super.viewDidLoad()
loadData()
}
func loadData(){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) ) {
dispatch_async(dispatch_get_main_queue()){
self.actInd.startAnimating()
}
var pageSource=self.dpm.readData("https://url.com")
dispatch_async(dispatch_get_main_queue()){
self.refreshUI()
self.actInd.stopAnimating()
}
}
}
func refreshUI(){
//refresh UI
}
func readData(url:String)->NSData?{//This method is in a separate class. dpm
var myUrl=NSURL(string: url)
var request:NSMutableURLRequest=NSMutableURLRequest(URL: myUrl!)
request.timeoutInterval=30
let myHTMLData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
return myHTMLData
}
总结一下我的意图:
它有效,但有时会崩溃......我的想法是错的吗?
感谢任何帮助。
谢谢!
答案 0 :(得分:1)
这些是看门狗超时崩溃报告,您可以通过臭名昭着的“吃不好的食物”(0x8badf00d)异常代码识别出来。有关如何破译崩溃日志和潜在解决方案的更多信息,请访问:
https://developer.apple.com/library/ios/qa/qa1693/_index.html
答案 1 :(得分:0)
仅仅因为你将工作编组到后台线程并不意味着同步发出请求是一个好主意。您应该使用NSURLSession
的异步API,然后在您的应用程序转到后台(或被要求终止)时取消请求。使用异步API是更多的工作,但是更正确的方法。 dispatch_async
不一定是足够的“适配器”。