如何使用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{
}
})
}
}
如何控制设置()是完全结束,循环将增加数和退出。如何解决这个问题呢。请帮忙。
你需要使用闭包的设置功能,这样当安装是否完成后,您会得到回调
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")
}
我改变了,但(通话中的“额外论证”成功“)错误发生。 –
好的,我会检查,并会尽快给您回复 –
你从哪里得到错误? –
的方式是什么,我可以理解是你想循环等待,直到数据没有被获取到该特定的交互编号中。如果是这种情况,那么你应该寻找同步操作。就像不要让控制传递到下一个迭代,直到操作完成。但这是一个糟糕的做法,并会使您的应用行为无法响应。
我会说在异步行上工作,并创建一个块或闭包,并将您的代码当您收到您的数据,并将该代码以外的代码放在不依赖于数据的预期执行。无论如何阻挡环境,在这种情况下,你不应该担心控制通过。
你能再细说一下吗?哪个循环退出,你想要什么。 –
首先,不要使用if..else,使用guard让代码更好。第二,在调用setUp()到异步代码和UI时使用GCD。 –
@KrishnaKumar在setUp()从服务器获取数据并将数据存储在部分中。在getMain()循环完成但setUp检索和保存还没有完成,那时getMain()循环退出。 –