【发布时间】:2015-04-23 23:05:59
【问题描述】:
我有时会在今天的小部件中遇到“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
}
总结一下我的意图:
- 在 viewDidLoad 上,调用 loadData()
- 在 loadData() 中,我使用了 dispatch_async,因为我想我应该在加载数据时使用与主线程不同的线程
- 在异步线程中,我调用readData(),从而调用NSURLConnection。 (我调用 sendSynchronousRequest,因为我相信 syncronousRequest 是可以的,因为它已经在 dispatch_async 中调用)
- 要在加载完成后刷新我的 UI,我调用 refreshUI()
它可以工作,但有时它会崩溃......我的想法错了吗??
感谢任何帮助。
谢谢!!
【问题讨论】:
标签: ios multithreading nsurlconnection grand-central-dispatch