2015-05-27 23 views
5

Điều này xảy ra rất hiếm khi. Dưới đây là những dòng cuối cùng của stack trace:dispatch_group_leave crash trong swift

0 libdispatch.dylib    0x0000000197a85a9c dispatch_group_leave + 48 

dispatch_group_leave được gọi trong một kết thúc hoàn chỉnh được gọi như thế này:

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() 

Vì vậy, chúng tôi cử to a thread nền, chạy một HKStatisticsCollectionQuery, và sau đó gọi một tham số chức năng gọi là hoàn thành. Bên trong hoàn thành là nơi dispatch_group_leave được gọi và sự cố xảy ra.

Bất kỳ ý tưởng nào được đánh giá cao nhất! Cảm ơn!

Trả lời

12

Nếu số gọi dispatch_group_leave không được cân bằng với dispatch_group_enter thì sự cố có thể xảy ra.

+0

Thú vị. Tôi có một bước vào trước khi đóng cửa đầu tiên được gọi. hmmm – jestro

+0

Tôi nghĩ rằng đây là nó. Một số lá đã được gọi quá nhanh. Di chuyển tất cả các đi vào và thông báo trước khi lá có thể được gọi. Cảm ơn! – jestro

+0

@mustafa có cách nào để ngăn chặn trường hợp gọi dispatch_group_leave nhiều hơn không? tức là, đối với các trường hợp mà tôi không thể chắc chắn rằng khối hoàn thành - trong đó dispatch_group_leave được gọi - sẽ không được gọi nhiều hơn một lần? – ofer2980