【问题标题】:Semaphore does not wait before executing block of code after it信号量在执行它之后的代码块之前不会等待
【发布时间】:2015-02-15 03:57:45
【问题描述】:

我在使用信号量方面还很陌生,所以我不确定我是否正确使用它。

当我尝试这样做时:

var group = dispatch_group_create();
dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)){

    var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
    myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
        // do some stuff once
        println("WE ARE IN HERE")   
        firstName = snapshot.value["firstName"] as String!
        lastName = snapshot.value["lastName"] as String!
    })
}
dispatch_semaphore_wait(group, DISPATCH_TIME_FOREVER)
dispatch_semaphore_signal(group)
println("WE MADE IT OUT OF THERE")

输出总是:

"WE MADE IT OUF OF THERE"
"WE ARE IN HERE"

为什么它不等待我的信号量完成再执行其余代码?

编辑:

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
        // do some task
        var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
        myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
            // do some stuff once
            println("WE ARE IN HERE")
            firstName = snapshot.value["firstName"] as String!
            lastName = snapshot.value["lastName"] as String!
        })
});

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> () in
    // do some task
    var standbyData = [
        "firstName":firstName,
        "lastName":lastName,
        "duration":self.helpDurationLabel.text!,
        "radius":self.helpRadiusLabel.text!,
        "categories": categories,
        "time_stamp":self.date.timeIntervalSince1970
    ]
    println("WE ARE OUT HERE")
    var standbyUserRef = self.standbyRef.childByAppendingPath(self.userRef.authData.uid)
    standbyUserRef.updateChildValues(standbyData)
});

由于我将 2 个同步线程放在同一个队列中,这不应该有效吗?

【问题讨论】:

    标签: ios swift semaphore


    【解决方案1】:

    您在这里混淆了几个概念——调度组和信号量用于不同的目的。您需要 (1) 创建一个信号量,(2) 在您的块中,发出信号量,以及 (3) 在块外等待信号量:

    注意:这将在等待时阻塞它正在运行的任何线程,因此如果它在主线程上,它将暂停用户交互——这不是一个好主意。您最好阅读 Apple 的 Concurrency Programming Guide 以了解其余概念。

    var semaphore = dispatch_semaphore_create(0)
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)){
        var myRef = self.userRef.childByAppendingPath(self.userRef.authData.uid)
        myRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
            // do some stuff once
            println("WE ARE IN HERE")   
            firstName = snapshot.value["firstName"] as String!
            lastName = snapshot.value["lastName"] as String!
        })
        dispatch_semaphore_signal(semaphore)
    }
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    println("WE MADE IT OUT OF THERE")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-12
      • 2015-06-02
      • 1970-01-01
      • 2013-02-07
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多