以未捕获的异常终止:NSException

Posted

技术标签:

【中文标题】以未捕获的异常终止:NSException【英文标题】:terminating with uncaught exception: NSException 【发布时间】:2019-11-28 07:46:42 【问题描述】:

Swift 应用程序崩溃并给我这个错误。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.'
*** First throw call stack:
(0x1aa5a980c 0x1aa2d1fa4 0x1aaa7ff1c 0x1aa88ad64 0x1aa88ac7c 0x1aa88a8f0 0x1aeaa6c34 0x1aeaa766c 0x1b0ff578c 0x1b0ffb908 0x1b1006528 0x1b0f4eed0 0x1b0f78bbc 0x1b0f79b40 0x1aa2c9344 0x1aa2c622c 0x1aa2c7280 0x1aa2c7018 0x1aa2c9ad4)
libc++abi.dylib: terminating with uncaught exception of type NSException

现在我遇到的问题是我不知道是什么引发了这个错误。

我只能认为它发生在脚本的新闻部分,因为当我从一个屏幕转到另一个屏幕时它没有发生在原始脚本中。

我知道是 newsViewController 上的某些东西导致它触发。

这是新闻的视图控制器脚本。

//
//  NewsViewController.swift
//  DRN1
//
//  Created by Russell Harrower on 26/11/19.
//  Copyright © 2019 Russell Harrower. All rights reserved.
//

import UIKit


struct NewsData: Decodable
    let news: [articalData]


struct articalData: Decodable
    let title: String


class NewsViewController: UIViewController 
    @IBOutlet weak var tableView: UITableView!

    var news: [News] = []

    override func viewDidLoad() 
      super.viewDidLoad()

        self.newsfetch  [weak self] news in
            guard let news = news else  return 
            self?.news = news
            self?.tableView.reloadData()
        

        tableView.delegate = self
        tableView.dataSource = self
    

    func createArray() -> [News] 

           return [News(title: "Hello") , News(title: "how") , News(title: "You")]

    

    func newsfetch(_ completionHandler:  @escaping ([News]?)->Void)
        let jsonURLString = "https://api.drn1.com.au/api-access/news"
        guard let feedurl = URL(string: jsonURLString) else   return 

        URLSession.shared.dataTask(with: feedurl) (data,response,err)
            in
            guard let news = data else  return 
            do 
                let newsdata = try JSONDecoder().decode(NewsData.self, from: news)
                var tempNews: [News] = []
                newsdata.news.forEach()
                    tempNews.append(News(title: $0.title))
                
                completionHandler(tempNews)
             catch let jsonErr 
                print("error json ", jsonErr)
                completionHandler(nil)
            
        .resume()

    


    /*func newsfetch() -> [News]

        var tempNews: [News] = []
                    let jsonURLString = "https://api.drn1.com.au/api-access/news"
                    guard let feedurl = URL(string: jsonURLString) else   return tempNews 

                      URLSession.shared.dataTask(with: feedurl)  (data,response,err)
                          in

                          guard let news = data else  return 

                          do
                            let newsdata = try JSONDecoder().decode(NewsData.self, from: news)

                            newsdata.news.forEach()

                                DispatchQueue.main.async 
                                    print($0.title)

                                    tempNews.append(News(title: $0.title))
                                    print(tempNews.count)
                                
                            
                            catch let jsonErr

                                print("error json ", jsonErr)
                            


                      .resume()



        return tempNews

        */


  override func viewDidAppear(_ animated: Bool) 
    self.tabBarController?.navigationItem.title = "News"




  




extension NewsViewController: UITableViewDataSource, UITableViewDelegate 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return news.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let newsa = news[indexPath.row]

        let cell = tableView.dequeueReusableCell(withIdentifier: "NewsCell") as! NewsCell
        cell.setNews(news: newsa)
        return cell
    

【问题讨论】:

在主线程上重新加载表! @ShivamGaur 怎么样? 将您的 tableview.reloadData 行更改为这一行 - DispatchQueue.main.async self.?.tableView.reloadData() DispatchQueue.main.async self.tableView.reloadData() 【参考方案1】:

您需要在主线程上重新加载您的 tableView。正如错误提示,对布局引擎的修改应始终通过主线程完成。

将您的 tableview.reloadData 行更改为这一行 -

DispatchQueue.main.async  
self?.tableView.reloadData() 

【讨论】:

以上是关于以未捕获的异常终止:NSException的主要内容,如果未能解决你的问题,请参考以下文章

以 CKException 类型的未捕获异常终止

以 NSException Timer Swift Crash 类型的未捕获异常终止

线程以未捕获的异常退出,AyncTask #2 致命错误

Java - 线程以未捕获的异常退出(组 = 0x95d40b20)

添加到 MKMapView 时的 UILongPressGestureRecognizer 问题

我在哪里捕获 MVVM 中的异常?