ios“在允许的时间之外有活动断言:”异步任务崩溃

时间:2015-01-25 16:19:45

标签: ios multithreading nsurlconnection grand-central-dispatch

我有时会遇到崩溃" 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
    }

总结一下我的意图:

  1. 在viewDidLoad上,调用loadData()
  2. 在loadData()中,我使用了dispatch_async,因为我想在加载数据时我应该使用与主线程不同的线程
  3. 在异步线程中,我调用readData(),因此调用NSURLConnection。 (我调用sendSynchronousRequest,因为我认为syncronousRequest是正常的,因为它已在dispatch_async中调用)
  4. 要在加载完成后刷新我的UI,我调用refreshUI()
  5. 它有效,但有时会崩溃......我的想法是错的吗?

    感谢任何帮助。

    谢谢!

2 个答案:

答案 0 :(得分:1)

这些是看门狗超时崩溃报告,您可以通过臭名昭着的“吃不好的食物”(0x8badf00d)异常代码识别出来。有关如何破译崩溃日志和潜在解决方案的更多信息,请访问:

https://developer.apple.com/library/ios/qa/qa1693/_index.html

答案 1 :(得分:0)

仅仅因为你将工作编组到后台线程并不意味着同步发出请求是一个好主意。您应该使用NSURLSession的异步API,然后在您的应用程序转到后台(或被要求终止)时取消请求。使用异步API是更多的工作,但是更正确的方法。 dispatch_async不一定是足够的“适配器”。