Парсинг JSON и дальнейшая работа с массивом для вывода на TableView

json
array
tableview

#1

Здравствуйте все!
Существует задача: имеется JSON файл известной структуры содержащий сообщения социальной сети. Необходимо в зависимости от типа сообщения произвести определенные действия (картинку открыть в новом окне, перейти по ссылке открыв ее в браузере). Все сообщения отразить в виде отсортированной по дате таблицы.
Мне удалось распарсить файл и сделать сортировку. Однако дальше я продвинуться не могу, поскольку мой массив messagesSorted никак не выдается вовне сессии. Прошу помощи, пожалуйста. Делаю через URLSession дабы в дальнейшем знать как работать с JSON из сети.

import UIKit

class TableTableViewController: UITableViewController {

struct Message : Decodable {
    var type : String
    var date : String
    var network : String?
    var title : String?
    var content : String?
    var source : String?
}



override func viewDidLoad() {
    super.viewDidLoad()
    
    let urlString = "file:///Developer/TestCFT/messages.json"
    
    guard let url = URL(string: urlString) else { return }
    
    

    
    URLSession.shared.dataTask(with: url) { (data, responce, error) in
        guard let data = data else { return }
        guard error == nil else { return }
        
        var messages = [Message]()
        var messagesSorted = [Message]()
        
        do {
            messages = try JSONDecoder().decode([Message].self, from: data)
        } catch let error {
            print(error)
        }
        
        messagesSorted = messages.sorted(by: {$0.date > $1.date})
        print(messagesSorted)
        
        } .resume()
   }
}

#2

Если я правильно понял, то var messagesSorted = [Message] () и var messages = [Message] (),ты объявляешь внутри сессии. Выходит что это локальная переменная. Поэтому доступна только внутри сессии.
Объяви массив как глобальную переменную и тогда сможешь дальше с ним работать.


#3

Спасибо за предположение. Да, объявляю внутри сессии, иначе оно не работает. Может я какой-то параметр не указываю в описании сессии. Введение новое относительно и материала не так много… к сожалению…


#4

Проблема решена. Действительно надо было объявить переменные вне функции. В функции они используются с префиксом self. , а также добавлена функция DispatchQueue внутри do - catch.