ios "has active assertions beyond permitted time:" 异步任务崩溃

ios "has active assertions beyond permitted time:" crash with async task

我的今日小部件有时会崩溃 "myApp has active assertions beyond permitted time:"。 google了一下,估计是后台任务处理不当造成的。

我使用两种类型的后台任务。 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()

可以用,但有时会崩溃...我的想法是错误的吗??

感谢任何帮助。

谢谢!!

仅仅因为您将工作编组到后台线程并不意味着同步发出请求是个好主意。您应该使用 NSURLSession 的异步 API,然后在您的应用程序进入后台(或被要求终止)的情况下取消请求。使用异步 API 工作量更大, 但这是更正确的方法。 dispatch_async 不一定足够 "adapter."

这些是看门狗超时崩溃报告,您可以通过臭名昭著的 "ate bad food" (0x8badf00d) 异常代码识别它们。有关如何破译崩溃日志和潜在解决方案的更多信息,请访问:

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