Как получить измененное значение контроллера вида из функции?

#swift #uitableview #uiviewcontroller #adapter #operation

Вопрос:

У меня есть задача создать «адаптер» для моей службы операций:

 class OperationsService {
    
    private var viewController: UIViewController
    
    private let operationQueue = OperationQueue()
    
    init(viewController: UIViewController) {
        self.viewController = viewController
    }

    func getFriends() {
        let request = Alamofire.request(...)
        let getDataOperation = GetDataOperation(request: request)
        operationQueue.addOperation(getDataOperation)
        
        let parseDataOperation = ParseDataOperation<UserModel>()
        parseDataOperation.addDependency(getDataOperation)
        operationQueue.addOperation(parseDataOperation)
        
        let reloadTableOperation = ReloadTableOperation<UserModel>(controller: viewController)
        reloadTableOperation.addDependency(parseDataOperation)
        OperationQueue.main.addOperation(reloadTableOperation)
    }
 

Я решил создать фиктивный VC, чтобы передать его в свою службу операций:

 class OperationsAdapter {
    
    private var operationsService: OperationsService?
    
    func getFriends(completion: @escaping ([UserModelItem]) -> Void) {
        let dummyVC = FriendsViewController()
        operationsService = OperationsService(viewController: dummyVC)
        operationsService!.getFriends()
        let friends = dummyVC.friends // friends == 0
        completion(friends)
    }
}
 

Где FriendsViewController зависает вот так:

 class FriendsViewController: UIViewController {
    
    @IBOutlet weak var tableView: UITableView!
    
    var friends: [UserModelItem] = []
    
    private var operationsAdapter = OperationsAdapter()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        operationsAdapter.getFriends { [weak self] friends in
            guard let self = self else { return }
            self.friends = friends
            self.tableView.reloadData()
        }
 

Но я получаю 0 друзей из функции getFriends() и не могу понять, почему.

Я также думаю, что вам нужно посмотреть на операцию перезагрузки:

 class ReloadTableOperation<T: Codable>: Operation {
    
    private var controller: UIViewController?
    
    init(controller: UIViewController?) {
        self.controller = controller
    }
    
    override func main() {
        guard
            let parseDataOperation = dependencies.first as? ParseDataOperation<T>,
            let parsedData = parseDataOperation.outputData
        else { return }
        
        guard
            let friendsViewController = controller as? FriendsViewController,
            let friends = parsedData as? [UserModelItem]
        else { return }
            
        friendsViewController.friends = friends // friends != 0

        if friendsViewController.tableView != nil {
            friendsViewController.tableView.reloadData()
        }
    }
}    
 

В этом классе FriendsViewController.friends не равно 0, но это значение не передается обратно.

Комментарии:

1. Я думаю, вам нужно взглянуть на типичный дизайн приложения с таблицей, поддерживаемой сетевыми запросами… Например: raywenderlich.com/books/ios-apprentice/v8.3/chapters/… Очень странно видеть, как ViewController передается таким образом и особенно управляется из службы. Не говоря уже о том, что вы получите случайные сбои, когда это произойдет не в главном потоке.