我已经在In Swift, how to stop all the process until datas retrieved from parse.com in UICOLLECTIONVIEW上问了这个问题。在下一个函数执行之前,我无法从parse.com检索数据。我不知道如何访问异步线程。我已将主队列声明为" first_fun()",因此应首先运行。同样,它首先运行,但最后结束。在此之前,下一个函数(" second_fun()")被执行。如何排队这个功能块?如何先完成异步线程?请检查我的代码。
我的代码如下:
override func viewDidLoad() {
println("START")
let queue : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue, {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.first_fun()
})
})
second_fun()
println("END")
}
// FIRST_FUN
func first_fun() {
println("FIRST CLASS TOP")
self.par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in
if (error != nil) {
NSLog("error " + error.localizedDescription)
}
else {
println("WELCOME to PARSE")
}//ELSE ENDING
})//PARSE ENDING
println("FIRST CLASS BOTTOM")
}
// SECOND_FUN
func second_fun() {
println("WELCOME to SECOND")
}
答案 0 :(得分:1)
您的问题的本质是“我如何将异步设计转变为同步设计”,这没有多大意义。当人们接受传统的程序式编程训练,然后尝试解决基于功能/事件的系统中的问题时,人们会碰到这堵墙。
你的问题的答案是“不要那样做”。你必须学习一种新的系统设计风格,其中在second_fun()中发生的一切都不依赖于first_fun()的结果。如果第一个和第二个真正依赖,那么你应该调用second_fun()作为first_fun()中的最后一个操作。
例如,如果您的视图取决于您从互联网上下载的数据(这可能是一个长时间运行的操作),您通常会设置您的视图以显示旋转等待指标,然后您将制作你对findObjectsInBackgroundWithBlock()的调用。在回调中,您将处理找到的结果,初始化其他UI元素,然后将等待指示符替换为您想要的视图内容。
你必须停止在程序上思考并开始在功能上思考。
答案 1 :(得分:0)
你可以做的是在first_fun中添加一个回调并在回调中调用second_fun,如下所示:
func first_fun(callback: () -> ()) {
//do something async e.g your call to parse
self.par_query.findObjectsInBackgroundWithBlock({(NSArray objects, NSError error) in
if (error != nil) {
NSLog("error " + error.localizedDescription)
}
else {
println("WELCOME to PARSE")
}//ELSE ENDING
callback()
})//PARSE ENDING
}
你的viewDidLoad看起来像这样:
override func viewDidLoad() {
let queue : dispatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(queue, {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.first_fun() {
self.second_fun()
}
})
})
}
当然,您也应该参数化该回调以访问数据或来自解析
的错误