2016-06-28 45 views
-1

即时尝试与firebase一起工作,我做了这个功能,将一个数组“节能”保存到另一个视图控制器,并将它们显示在一个tableView上。Swift Make For Loop等待异步函数结束

我发现一个问题,即在数据来自服务器之前,for循环结束,并且firebase的回调即将到来,您可以在其中看到“fir(self.goodOffer ...)”行结束的firebase回调。

也许有人知道我该如何让for循环等待firebase回调结束?

thx。

geocodeAddress(totalFromLocation, callback: { (location) in 

       if location != nil { 
        fromLocation = location 
        self.geocodeAddress(totalToLocation, callback: { (location) in 
         if location != nil { 
          toLocation = location 
          mainDistance = Int(self.distanceCalculate(fromLocation!, locationTwo: toLocation!)) 
          print(mainDistance) 

          REF_BUSSINES_OFFERS.queryOrderedByKey().queryEqualToValue("north").observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
           print("in snap") 
           if let value = snapshot.value { 
            if self.isAlavator { 
             if let area = value["north"] { 
              if let data = area!["withAlavator"]! { 
               if let bids = data["bids"] as? Int { 
                for i in 1..<bids+1 { 
                 if let bid = data["\(i)"] { 
                  let bidFromSize = bid!["fromSize"] as! Int 
                  let bidToSize = bid!["toSize"] as! Int 

                  let bidFromDistance = bid!["fromDistance"] as! Int 
                  let bidToDistance = bid!["toDistance"] as! Int 

                  if mainDistance >= bidFromDistance && mainDistance <= bidToDistance { 
                   if Int(totalSize) >= bidFromSize && Int(totalSize) <= bidToSize { 
                    let price = String(bid!["price"]) 
                    let name = bid!["name"] as! String 
                    let phoneNumber = bid!["phoneNumber"] as! String 
                    var logoImageData: NSData! 
                    LOGOS_REF.child("\(phoneNumber)").dataWithMaxSize(3 * 1024 * 1024, completion: { (data, error) in 
                     if error != nil { 
                      logoImageData = UIImagePNGRepresentation(UIImage(named: "company")!) 
                     } else { 
                      logoImageData = data 
                     } 
                     let offer = Offer(logoImage: logoImageData, name: name, price: price) 
                     self.goodOffers.append(offer) 
                     print("fir \(self.goodOffers[0].price)") 
                    }) 
                   } 
                  } 
                 } 
                 print(i) 
                }//end of for 
                print("out") 
                //self.changgeViewToTable() 
               } 
+5

好悲伤,你的代码跑离屏幕的一侧。不能切换'返回'或什么东西,所以你可以早点回来,而不是嵌套你知道深层次多少层次的东西。 (还有什么是“alavator”?) –

+1

当您修复错误时,您应该将此发布到[Code Review](http://codereview.stackexchange.com/),您的代码是恶梦素材 – Kametrixom

回答

2

不能帮你多少,因为你的代码是这样一个痛苦的阅读。使用ObjectMapper来减少映射这些字段的级别(和努力)。总之,你可以使用dispatch_group的各种异步调用同步:

let group = dispatch_group_create() 
for i in 1..<bids+1 { 
    // ... 
    dispatch_group_enter(group) 
    LOGOS_REF.child("\(phoneNumber)").dataWithMaxSize(3 * 1024 * 1024) { 
     // ... 

     dispatch_group_leave(group) 
    } 
}  

// Wait for all async calls to complete before proceeding 
dispatch_group_wait(group, DISPATCH_TIME_FOREVER) 

每个dispatch_group_enter()应该用dispatch_group_leave()进行平衡时,异步任务完成。

+0

我真的不知道在哪里你从OP问题中得到了这段代码,但是你可能希望'dispatch_group_wait'在'for'循环之后,所以所有的调用异步运行 – Kametrixom

+0

@Kametrixom好眼睛。我将'dispatch_group_wait'移到'for'循环之外。谢谢! –

+0

@CodeDifferent'dispatch_group_notify(group,dispatch_get_main_queue()){self.changgeViewToTable()}'会比'dispatch_group_wait(group,DISPATCH_TIME_FOREVER)'更好。 –