【问题标题】:ios "has active assertions beyond permitted time:" crash with async taskios“有超出允许时间的活动断言:”异步任务崩溃
【发布时间】: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
    }

总结一下我的意图:

  1. 在 viewDidLoad 上,调用 loadData()
  2. 在 loadData() 中,我使用了 dispatch_async,因为我想我应该在加载数据时使用与主线程不同的线程
  3. 在异步线程中,我调用readData(),从而调用NSURLConnection。 (我调用 sendSynchronousRequest,因为我相信 syncronousRequest 是可以的,因为它已经在 dispatch_async 中调用)
  4. 要在加载完成后刷新我的 UI,我调用 refreshUI()

它可以工作,但有时它会崩溃......我的想法错了吗??

感谢任何帮助。

谢谢!!

【问题讨论】:

    标签: ios multithreading nsurlconnection grand-central-dispatch


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您是否建议我应该放弃 dispatch_async 并仅使用 NSURL 异步?还是应该使用 dispatch_async 和 NSURL 异步?
      • 如果您使用NSURLSession async API,您应该不再需要使用dispatch_async
      猜你喜欢
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多