Добавление зависимости одного BlockOperation от другого не работает должным образом в Swift - PullRequest
0 голосов
/ 28 января 2020

У меня есть несколько API в контроллере, и после успешного ответа я должен перезагрузить UITableView.

На данный момент я начал с двух API, имеющих вторую зависимость API от первой, используя BlockOperation и DispatchGroup в нем.

Сначала в viewDidLoad:

getDataFromAllApis {
    self.tableView.reloadData()
}

Затем я добавил метод:

func getDataFromAllApis(completion: @escaping (() -> Void)) {

    let queue = OperationQueue()

    let getFirstDataOperation = BlockOperation {
        let group = DispatchGroup()
        group.enter()
        self.getFirstDataFromApi {
            group.leave()
        }
        group.wait()
    }
    queue.addOperation(getFirstDataOperation)

    let getSecondDataOperation = BlockOperation {
        let group = DispatchGroup()
        group.enter()
        self.getSecondDataFromApi {
            group.leave()
        }

        group.notify(queue: .main) {
            completion()
        }
    }
    queue.addOperation(getSecondDataOperation)

    getSecondDataOperation.addDependency(getFirstDataOperation)
}

Проблема, с которой я здесь сталкиваюсь, заключается в выполнении getSecondDataOperation сначала и возвращается к части перезагрузки табличного представления.

Я что-то здесь упускаю или может быть другой подход к этому? Буду признателен за любую помощь.

Я пытался просмотреть этот пост:

1 Ответ

4 голосов
/ 28 января 2020

Вы слишком обдумываете это. Просто вызовите второй API из обработчика завершения первого API. Нет операций, нет групп рассылки, нет ничего.

self.getFirstDataFromApi {
    self.getSecondDataFromApi {
        // call the completion handler
    }
}

Что касается того, почему ваш код не работал, это потому, что вы не сделали то, что сказал связанный ответ!

Как вы можете использовать группы рассылки для ожидания вызова нескольких функций, которые зависят от разных данных?

Сказано сделать это:

getSecondDataOperation.addDependency(getFirstDataOperation)
queue.addOperation(getFirstDataOperation)
queue.addOperation(getSecondDataOperation)

Это не то, что вы сделали. Вы сделали это:

queue.addOperation(getFirstDataOperation)
queue.addOperation(getSecondDataOperation)
getSecondDataOperation.addDependency(getFirstDataOperation) // too late

(Однако этот пост, хотя и гениальный, не то, что я бы сделал в этой ситуации. Если бы я хотел упорядочить операции загрузки, я бы использовал описанную здесь технику: https://fluffy.es/download-files-sequentially/. Или, в iOS 13, я бы использовал каркас Combine, как я здесь опишу: { ссылка }.)

...