在 Swift 中,为什么 GCD 无法使用解析?
In Swift, why GCD is not working with parse?
我已经在 In Swift, how to stop all the process until datas retrieved from parse.com in UICOLLECTIONVIEW 上问过了。在执行下一个函数之前,我无法从 parse.com 检索数据。我不知道如何访问异步线程。我已将主队列声明为 "first_fun()",因此首先应为 运行。同样,先是运行ning,最后才结束。在此之前,下一个函数 ("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")
}
你的问题的实质是 "how do I turn an asynchronous design into a synchronous one," 这没有多大意义。人们在接受传统过程式编程培训然后尝试在基于 functional/event 的系统中解决问题时遇到了这堵墙。
你的问题的答案是 "don't do that." 你必须学习一种新的系统设计风格,其中 second_fun() 中发生的一切都不依赖于 first_fun 的结果().如果第一个和第二个真正相关,那么您应该调用 second_fun() 作为 first_fun() 中的最后一个操作。
例如,如果您有一个视图依赖于您从互联网上下载的数据(这可能是一个很长的 运行 操作),您通常会将视图设置为显示一个旋转的等待指示器,然后您将调用 findObjectsInBackgroundWithBlock()。在回调中,您将处理找到的结果,初始化其他 UI 元素,然后将 waiting-indicator 替换为您想要的视图内容。
你必须停止程序性思考,开始功能性思考。
您可以做的是向 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()
}
})
})
}
您当然还应该参数化该回调以访问来自解析的数据或错误
我已经在 In Swift, how to stop all the process until datas retrieved from parse.com in UICOLLECTIONVIEW 上问过了。在执行下一个函数之前,我无法从 parse.com 检索数据。我不知道如何访问异步线程。我已将主队列声明为 "first_fun()",因此首先应为 运行。同样,先是运行ning,最后才结束。在此之前,下一个函数 ("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")
}
你的问题的实质是 "how do I turn an asynchronous design into a synchronous one," 这没有多大意义。人们在接受传统过程式编程培训然后尝试在基于 functional/event 的系统中解决问题时遇到了这堵墙。
你的问题的答案是 "don't do that." 你必须学习一种新的系统设计风格,其中 second_fun() 中发生的一切都不依赖于 first_fun 的结果().如果第一个和第二个真正相关,那么您应该调用 second_fun() 作为 first_fun() 中的最后一个操作。
例如,如果您有一个视图依赖于您从互联网上下载的数据(这可能是一个很长的 运行 操作),您通常会将视图设置为显示一个旋转的等待指示器,然后您将调用 findObjectsInBackgroundWithBlock()。在回调中,您将处理找到的结果,初始化其他 UI 元素,然后将 waiting-indicator 替换为您想要的视图内容。
你必须停止程序性思考,开始功能性思考。
您可以做的是向 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()
}
})
})
}
您当然还应该参数化该回调以访问来自解析的数据或错误