Вызов функции ViewController из другого файла .swift - PullRequest
1 голос
/ 02 августа 2020

У меня есть collectionView, который я хочу reloadData() после получения определенных данных. Проблема в том, что я не знаю, как вызвать функцию ViewController из другого файла .swift, который обрабатывает данные. Я пробовал делать:

class WebSocketLogic: WebSocketDelegate {
    var viewController = ViewController()
    var columns = 0
    var rows = 0
...
    func receiveData {
        ...
        columns = map.count
        rows = map[0].count
        viewController.collectionView.reloadData()
    }
}

Это дало мне Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeec870fe8) ошибку в строке инициализации ViewController(). Я также пробовал делать:

class ViewController: UIViewController {
    
    @IBOutlet weak var collectionView: UICollectionView!
    
    var webSocket = WebSocketLogic(roomId: 1)
    var columns = 0 {
        didSet {
            collectionView.reloadData()
            print("columns number set to: \(columns)")
        }
    }
    var rows = 0  

    override func viewDidLoad() {
        super.viewDidLoad()
        
        webSocket.setupStarScream()
        columns = webSocket.columns
        rows = webSocket.rows
    }
}

Но по какой-то причине didSet вызывается только один раз и в самом начале. Что я могу сделать, чтобы вызвать reloadData() в ViewController один раз receiveData() веселье c завершится в другом файле?

1 Ответ

3 голосов
/ 02 августа 2020

Вы можете использовать шаблон делегирования

protocol DataDelegate {
    func dataReceived()
}

class WebSocketLogic: WebSocketDelegate {
    var delegate: DataDelegate?
    var columns = 0
    var rows = 0
...
    func receiveData {
        ...
        columns = map.count
        rows = map[0].count
        delegate?.dataReceived()
    }
}

class ViewController: UIViewController, DataDelegate {
    
    @IBOutlet weak var collectionView: UICollectionView!
    
    var webSocket = WebSocketLogic(roomId: 1)
    var columns = 0 {
        didSet {
            collectionView.reloadData()
            print("columns number set to: \(columns)")
        }
    }
    var rows = 0  

    override func viewDidLoad() {
        super.viewDidLoad()
        webSocket.delegate = self
        
        webSocket.setupStarScream()
        columns = webSocket.columns
        rows = webSocket.rows
    }
   
    func dataReceived() {
        collectionView.reloadData()
    }
}
...