0

我在控制器中有多个 api,成功响应后,我必须重新加载UITableView.

现在我从两个 api 开始,第二个 api 依赖于第一个使用BlockOperation和其中DispatchGroup的 api。

首先在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 首先执行并返回到 tableview 重新加载部分。

我在这里遗漏了什么还是可以有不同的方法?任何帮助将不胜感激。

我试过通过这篇文章:

4

1 回答 1

5

你想太多了。只需从第一个 API 的完成处理程序调用第二个 API。没有操作,没有调度组,什么都没有。

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

至于为什么您的代码不起作用,那是因为您没有按照链接的答案所说的去做!

如何使用 Dispatch Groups 等待调用依赖于不同数据的多个函数?

它说这样做:

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 框架,正如我在此描述的:https ://stackoverflow.com/a/59889993/341994 。)

于 2020-01-28T15:56:38.760 回答