我最近遇到了Alamofire的问题(更常见的是异步调用)
我有两个模型,列表和用户。列表包含用户的电子邮件,我也希望得到用户的姓名(我知道我也可以在后端解决这个问题,但是,我想看看是否有一个前端解决方案,因为这个问题也出现了更复杂的事情)
目前,我正在发出GET请求以获取所有商家信息,并且我正在循环查看这些商家信息,并发出另一个GET请求以获取名字,姓氏。 我需要等待获取此get请求的结果,或者至少将其附加到我的列表字典中。同样,在我做任何其他事情之前(转到我的应用程序的下一个屏幕),我希望将所有列表链接到名字,姓氏。因为这是一个循环,这特别似乎会导致一些问题(即如果它只是两个嵌套的GET请求,它可能在回调中)。有没有一种简单的方法来解决这个问题。我在下面附上了伪代码:
Profile.try(:qualification).all.sort_by do |x| ... end
答案 0 :(得分:0)
您的问题的答案称为dispatch group
当调度组中当前没有代码时,可以输入调度组并仅保留执行某些代码。
GET Request to grab listings{
var downloadGroup = dispatch_group_create()
//Create a dispatch group
for each listing{
dispatch_group_enter(downloadGroup)
//Enter the dispatch group
GET request to grab first_name, last_name (Async){
dispatch_group_leave(downloadGroup)
//Leave the dispatch group
}
}
dispatch_group_notify(downloadGroup, dispatch_get_main_queue()) {
//Run this code when all GET requests are finished
}
}
如此代码所示。
关于调度的来源和有趣的阅读材料:Ray {Wenderlich的Grand Central Dispatch Tutorial for Swift
答案 1 :(得分:0)
使用Scala风格的期货和承诺,你可以做这样的事情:
thisArg
上述表达式的结果是未来,其值是列表数组。
完成上述表达式后,打印列表的用户名:
let future: Future<[Listing]> = fetchListings().flatMap { listings in
listings.traverse { listing in
fetchUser(listing.userId).map { user in
listing.userName = "\(user.firstName) \(user.lastName)"
return listing
}
}
}
Scala风格的未来和承诺库:BrightFutures或FutureLib
下面是一个现成的代码示例,您可以将其粘贴到playgrounds文件中以试验上述任何库(在FutureLib中工作,BrightFutures可能需要稍作修改)。
future.onSuccess { listings in
listings.forEach {
print($0.userName)
}
}
答案 2 :(得分:-2)
这是一个可能的解决方案:
GET Request to grab listings:
var n = the number of listings
var i = 0 //the number of retrieved
for each listing:
GET request to grab first_name, last_name, callback: function(response){
assign first/last name using response.
i+=1
if(i==n)
load_next_page()
}
所以这样做可以反击你已经提取了多少名字/姓氏记录。确保处理获取名称的调用失败的情况。
或者,正如对问题的评论中所建议的那样,您可以使用承诺。他们使这样的异步代码更好。