如何使用swift同步代码嵌套循环?

问题描述:

在我的项目中,我调用了getMain()并且有嵌套循环。该循环调用setUp()。我的问题是setUp()完成前,上部循环退出。如何使用swift同步代码嵌套循环?

首先调用getMian():

func getMain(){ 

    let entityDescription = NSFetchRequest<NSFetchRequestResult>(entityName: "MainThemeHome") 
    do{ 
     let results = try context.fetch(entityDescription) 

     if(results.count) > 0 { 

      sections.removeAll() 
      debugPrint(results.count) 
      outer_count = results.count 

       for i in 0 ..< (results.count){ 


         let match = results[i] as! NSManagedObject 

         let associated_url = match.value(forKey: "main_associated_url") as! String 

         let name = match.value(forKey: "main_name") as! String 

         //call function 
          self.setUpViews(associated_url: associated_url, main_name: name, i: i) 
                self.myGroup.leave() 


       } 

         }else{ 

     } 

    }catch{} 


} 

循环呼叫建立()低于,

private func setUp(associated_url : String , main_name: String,i : Int) { 

     if Reachability().isInternetAvailable() == true { 

      self.rest.auth(auth: self.prefs.value(forKey: "access_token") as! String!) 
      self.rest.get(url: StringResource().mainURL + associated_url , parma: [ "show_min": "true" ], finished: {(result : NSDictionary, status : Int) -> Void in 

       self.assetsTable.removeAll() 
       if(status == 200){ 
        let data = result["data"] as! NSArray 

         for item in 0…data.count - 1 { 



          let themes : AnyObject = data[item] as AnyObject 
          let created = themes["created"] as! String 
          let assets_id = themes["id"] as! Int 
          let name = themes["name"] as! String 
          var poster_img_url = themes["poster_image_url"] as! String 
          let provider_id = themes["provider_id"] as! Int 

          poster_img_url = StringResource().posterURL + poster_img_url 


          self.assetsTable.append(AssetsTableItem(created: created, assets_id: assets_id, name: name, poster_image_url: poster_img_url , provider_id: provider_id)) 

         } 

     } 


        self.sections.append(SectionsHome(package_name: main_name, package_url: associated_url,i: i,packageTable: self.assetsTable)) 
        self.inner_count = self.sections.count 


       }else{ 


       } 
      }) 
    } 
    } 

如何控制设置()是完全结束,循环将增加数和退出。如何解决这个问题呢。请帮忙。

+0

你能再细说一下吗?哪个循环退出,你想要什么。 –

+0

首先,不要使用if..else,使用guard让代码更好。第二,在调用setUp()到异步代码和UI时使用GCD。 –

+0

@KrishnaKumar在setUp()从服务器获取数据并将数据存储在部分中。在getMain()循环完成但setUp检索和保存还没有完成,那时getMain()循环退出。 –

你需要使用闭包的设置功能,这样当安装是否完成后,您会得到回调

private func setUp(associated_url : String , main_name: String,i : Int, ,sucess:((Void) -> Void)?,failure:((Void?) -> Void)?) { 

     if Reachability().isInternetAvailable() == true { 

      self.rest.auth(auth: self.prefs.value(forKey: "access_token") as! String!) 
      self.rest.get(url: StringResource().mainURL + associated_url , parma: [ "show_min": "true" ], finished: {(result : NSDictionary, status : Int) -> Void in 

       self.assetsTable.removeAll() 
       if(status == 200){ 
        let data = result["data"] as! NSArray 

         for item in 0…data.count - 1 { 



          let themes : AnyObject = data[item] as AnyObject 
          let created = themes["created"] as! String 
          let assets_id = themes["id"] as! Int 
          let name = themes["name"] as! String 
          var poster_img_url = themes["poster_image_url"] as! String 
          let provider_id = themes["provider_id"] as! Int 

          poster_img_url = StringResource().posterURL + poster_img_url 


          self.assetsTable.append(AssetsTableItem(created: created, assets_id: assets_id, name: name, poster_image_url: poster_img_url , provider_id: provider_id)) 

         } 

     } 


        self.sections.append(SectionsHome(package_name: main_name, package_url: associated_url,i: i,packageTable: self.assetsTable)) 
        self.inner_count = self.sections.count 
       sucess!() 

       }else{ 
      failure!() 

       } 
      }) 
    } 
    } 

并更改调用函数作为

self.setUp(associated_url: associated_url, main_name: name, i: i, sucess: {() in 
    debugPrint("SUCCESS") 
}) {() in 
    debugPrint("FAILURE") 
    } 
+0

我改变了,但(通话中的“额外论证”成功“)错误发生。 –

+0

好的,我会检查,并会尽快给您回复 –

+0

你从哪里得到错误? –

的方式是什么,我可以理解是你想循环等待,直到数据没有被获取到该特定的交互编号中。如果是这种情况,那么你应该寻找同步操作。就像不要让控制传递到下一个迭代,直到操作完成。但这是一个糟糕的做法,并会使您的应用行为无法响应。

我会说在异步行上工作,并创建一个块或闭包,并将您的代码当您收到您的数据,并将该代码以外的代码放在不依赖于数据的预期执行。无论如何阻挡环境,在这种情况下,你不应该担心控制通过。