Сбой при добавлении данных в NSTableView - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь добавить данные из массива, созданного с помощью классов, в NSScrollView с использованием NSArrayController

Вот класс и массив:

class Serie: NSObject {
    @objc dynamic var theID: String
    @objc dynamic var serieName: String
    @objc dynamic var serieAired: String
    @objc dynamic var serieNetwork: String
    @objc dynamic var serieStatus: String

    init(theID: String, serieName: String, serieAired: String, serieNetwork: String, serieStatus: String ) {
        self.theID = theID
        self.serieName = serieName
        self.serieAired = serieAired
        self.serieNetwork = serieNetwork
        self.serieStatus = serieStatus
    }
}

@objc dynamic var Series: [Serie] = []

Далее я связываю NSArrayController смассив классов "Series" и связывание TableViewCell с каждым элементом класса.

Изображение дерева TableView
Привязки и выходы изображения ArrayController
Привязки и выходы из TableViewCell image

Следующая функция - заполнение «динамической серии var», которая связывает содержимое с NSArrayController и заполняет NSScrollView:

func GetSerieID(theSerieName: String){

        let url = URL(string: ("https://api.thetvdb.com/search/series?name=" + theSerieName ))!

        var request = URLRequest(url: url)
        request.httpMethod = "GET"

        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization")
        //request.setValue( "en", forHTTPHeaderField: "Accept-Language")

        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {
                print(error?.localizedDescription ?? "No data")
                return
            }

            let json = try? JSON(data: data) // >> I use SwiftyJSON to manage JSON
            let theJSONContent = json!["data"]

            self.Series = [] // >> Empty the array Series

            for (_,subJson):(String, JSON) in theJSONContent {

                let serie = Serie(
                    theID: subJson["id"].stringValue,
                    serieName: subJson["seriesName"].stringValue,
                    serieAired: subJson["firstAired"].stringValue,
                    serieNetwork: subJson["network"].stringValue,
                    serieStatus: subJson["status"].stringValue
                )

                self.Series.append(serie) // >> Here is where it crashes
            }
        }
        task.resume()

        serieTabla.reloadData()
    }

Время от времени, TableView не отображает и не обновляет представление правильно и загружает пустые данные, которые хорошо отображаются в течение нескольких секунд, если вы щелкнете по нему, но обычно это работает, пока не будет загружено более 10 результатов. Вот большая проблема.

Это происходит случайным образом, но обычно, когда вы превышаете 10-20 единиц.

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

Журнал аварий:

miVideoGestor[82269:13639248] *** Assertion failure in -[NSTableRowData _addRowViewForVisibleRow:withPriorView:]


Не могу найти решение.

Может кто-нибудь подсказать, как решить проблему загрузки и отображения данных в tableView?

Спасибозаранее ребята

1 Ответ

0 голосов
/ 01 октября 2019

Поскольку вы используете привязки какао, основанные на наблюдении значения ключа, вы должны поместить любую строку, которая влияет на пользовательский интерфейс, в DispatchQueue.main блок

DispatchQueue.main.async {
    self.Series = []

    for (_,subJson):(String, JSON) in theJSONContent {

        let serie = Serie(
            theID: subJson["id"].stringValue,
            serieName: subJson["seriesName"].stringValue,
            serieAired: subJson["firstAired"].stringValue,
            serieNetwork: subJson["network"].stringValue,
            serieStatus: subJson["status"].stringValue
        )

        self.Series.append(serie) 
    }
    self.serieTabla.reloadData()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...