在Swift中,为什么GCD不使用解析?

时间:2015-01-31 06:56:15

标签: swift parse-platform grand-central-dispatch

我已经在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")

}

2 个答案:

答案 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()
            }
        })
    })
}

当然,您也应该参数化该回调以访问数据或来自解析

的错误

供参考:Further info for completion blocks in swift