dispatch_group_leave在swift中崩溃

jes*_*tro 12 closures ios swift healthkit

这很少发生.这是堆栈跟踪的最后一行:

0  libdispatch.dylib              0x0000000197a85a9c dispatch_group_leave + 48
Run Code Online (Sandbox Code Playgroud)

dispatch_group_leave在一个完整的闭包中调用,它被调用如下:

  dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
                { () -> Void in
                    let query = HKStatisticsCollectionQuery(quantityType: quantityType,
                        quantitySamplePredicate: nil,
                        options: statisticOptions,
                        anchorDate: anchorDate,
                        intervalComponents: interval)
                    query.initialResultsHandler = {

                        complete()
Run Code Online (Sandbox Code Playgroud)

所以我们调度到后台线程,运行HKStatisticsCollectionQuery,然后调用一个名为complete的函数参数闭包.内部完成是调用dispatch_group_leave并发生崩溃的地方.

任何想法都非常感谢!谢谢!

mus*_*afa 19

如果dispatch_group_leave呼叫不平衡,dispatch_group_enter则可能发生崩溃.

  • @mustafa有没有办法防止调用dispatch_group_leave的情况比它应该多?也就是说,对于我无法确定完成块的情况 - 其中调用了dispatch_group_leave - 不会被多次调用? (4认同)

小智 6

在最坏的情况下,您可以count通过其debugDescription字符串检查折扣组:

let count = self.groupExecuting.debugDescription.components(separatedBy: ",").filter({$0.contains("count")}).first!.components(separatedBy: CharacterSet.decimalDigits.inverted).filter({Int($0) != nil})
assert(count.first != "0")
Run Code Online (Sandbox Code Playgroud)

在这个问题中进一步探讨了这个策略:DispatchGroup:检查有多少“进入”

  • 什么在 tarnation (19认同)
  • @PranoyC 这显然不应该在生产代码中使用,但对于调试确实很有帮助。 (2认同)