gpt4 book ai didi

Swift:控制依赖函数,避免回调 hell

转载 作者:行者123 更新时间:2023-11-28 14:01:02 25 4
gpt4 key购买 nike

如何更好地设计以下代码?我感觉代码会导致回调 hell 。每个功能都取决于前一个功能的完成。

当前解决方案(不好):

@objc func restoreDocuments(UID: UID) {

DispatchQueue.global(qos: .background).async {

//1. Load user details from RemoteServer#1
UserManager.RemoteServer.loadUserFromRemoteServer(userUID: UID) { (userDict) in

//2. After user is loaded save user to local database
UserManager.LocalDB.saveUser(userData: userDict, completion: {

//After User is restored, restore his documents from RemoteServer#2 (IDs provided in userDetails)
let userDocumentsArray = getDocumentIDsFromUser(userUID: UID)

//Loop through array to get every ID
for ID in userDocumentsArray{

//load each document by ID
loadDocumentsRemote(documentID: ID) { (document) in

//Save loaded document
saveDocumentsLocal(document, completion: {

//At the end populate the UI with the restored documents
DispatchQueue.main.async {
populateUI()
}
})
})
}
})
}
}

我会想象类似下面的代码。但我不知道如何在彼此之间传达不同的步骤。因此任务 2 不会在任务 1 完成之前开始。

我想象的(简化):

 @objc func restoreDocuments(UID: UID) {

//1. Restore User
UserManager.RemoteServer.loadUser(UID){ (user) in }
UserManager.LocalDB.saveUser(user)
// -> WHEN FINISH PROCCED TO STEP 2 🚨

//2. Load Documents
UserManager.LocalDB.getDocumentIDsFromUser( { (IdArray) in

for ID in IdArray {
RemoteServer.DocManager.loadDocument(ID) { (retrievedDocument) in
LocalDB.DocManager.saveDocument(retrievedDocument)
}
}
}
// -> WHEN FINISH PROCCED TO STEP 3 🚨

//3. Finish
DispatchQueue.main.async {
populateUI()
}

}

但是我该怎么做呢?这是一个好方法吗🤔?

最佳答案

看看 futures 和 promises,这两个相关的设计模式很好地解决了这个问题。我的公司使用 BrightFutures,这是一个第三方库,可以很好地实现这两者。

关于Swift:控制依赖函数,避免回调 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53544899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com