异步调用和For循环

时间:2015-12-30 08:57:59

标签: loops asynchronous alamofire get-request

我最近遇到了Alamofire的问题(更常见的是异步调用)

我有两个模型,列表和用户。列表包含用户的电子邮件,我也希望得到用户的姓名(我知道我也可以在后端解决这个问题,但是,我想看看是否有一个前端解决方案,因为这个问题也出现了更复杂的事情)

目前,我正在发出GET请求以获取所有商家信息,并且我正在循环查看这些商家信息,并发出另一个GET请求以获取名字,姓氏。 我需要等待获取此get请求的结果,或者至少将其附加到我的列表字典中。同样,在我做任何其他事情之前(转到我的应用程序的下一个屏幕),我希望将所有列表链接到名字,姓氏。因为这是一个循环,这特别似乎会导致一些问题(即如果它只是两个嵌套的GET请求,它可能在回调中)。有没有一种简单的方法来解决这个问题。我在下面附上了伪代码:

Profile.try(:qualification).all.sort_by do |x| ... end

3 个答案:

答案 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风格的未来和承诺库:BrightFuturesFutureLib

下面是一个现成的代码示例,您可以将其粘贴到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()
   }

所以这样做可以反击你已经提取了多少名字/姓氏记录。确保处理获取名称的调用失败的情况。

或者,正如对问题的评论中所建议的那样,您可以使用承诺。他们使这样的异步代码更好。