#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 передается таким образом и особенно управляется из службы. Не говоря уже о том, что вы получите случайные сбои, когда это произойдет не в главном потоке.